[Zig] 포인터와 동적 할당
Zig는 C와 동일한 수준의 포인터를 지원한다. C를 사용해본 경험이 있다면 어려움 없이 사용할 수 있을 것이다.
&로 주소를 따올 수 있으며, *T나 *const T의 형태로 타입이 표현된다.
그리고 .*의 형태로 역참조를 할 수 있다.
아래 코드는 그에 대한 간단한 예제 코드다.
주소를 따서 주소를 통해 역참조해서 값을 할당한다.
당연히 함수 파라미터로도 넘길 수 있다.
별거없다.
C/C++와 마찬가지로 Zig는 dangling 포인터나 기타 유효하지 않은 포인터에 대한 어떤 관리나 책임도 갖지 않는다. 알아서 해야한다.
동적 할당
Zig는 수많은 고급 언어들과 다르게 메모리 할당 기능을 기본으로 제공하지 않는다.
그것뿐만이 아니라 메모리에 대한 그 어떤 것도 책임지거나 관리하지 않는다. 알아서 해야 한다.
Allocator 인터페이스를 통해서 간접적인 기능만을 제공한다. 이건 힙에 할당할 수도, 임의로 지정한 스택 시퀀스에 할당할 수도 있다.
아래는 힙 할당자를 이용한 간단한 예제 코드다.

const std = @import("std");
const Allocator = std.mem.Allocator;
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
// memory 영역 할당
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
// memory 영역 해제 (함수 종료시)
defer arena.deinit();
// allocator 생성
const allocator = arena.allocator();
// i32 타입의 메모리 할당
const ptr = try allocator.create(i32);
ptr.* = 42;
const a: i32 = ptr.*;
try stdout.print("Result: {?}\n", .{a});
}
보다시피 arena.deinit() 같은 함수를 이용해서 직접 메모리를 해제해야 한다. Zig는 아무런 책임도 지지 않는다.
그리고 allocator를 통해서 새로운 영역을 할당하거나 반환할 수 있다.
이런걸 누가 쓸까...?
참조
https://ziglang.org/documentation/0.11.0/#Pointers
https://ziglang.org/documentation/0.11.0/#Memory