Malloc 到 Zig 中的结构列表?
Malloc to a list of struct in Zig?
如何动态分配内存 space 并获取指向 Zig 中结构列表的指针。
就像在 C 中一样:
struct Foo* my_array_of_foo = (struct Foo*) malloc(10*sizeof(Foo));
const allocator: *std.mem.Allocator = std.heap.page_allocator; // this is not the best choice of allocator, see below.
const my_slice_of_foo: []Foo = try allocator.alloc(Foo, 10);
defer allocator.free(my_slice_of_foo);
这将分配一个长度为 10 的切片。稍后可以使用 allocator.free(my_slice_of_foo)
释放它
在 zig 中,数组通常表示为包含指针和项数的切片 (struct {ptr: [*]type, len: usize}
)。分配器有一个函数 .create(type)
为单个值分配 space 和 return 一个指针,还有一个函数 .alloc(type, count)
分配一个连续的数组和 return 一个切片.
std.heap.page_allocator
不是此类任务的分配器的最佳选择。我建议使用通用分配器,它可以为您捕获内存泄漏,更容易找到释放后使用错误,并更有效地使用内存:
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer std.debug.assert(!gpa.deinit());
const allocator = &gpa.allocator;
}
在测试中,最好使用测试分配器,它提供与通用分配器相同的安全功能,但由测试工具为您处理:
test "allocate stuff" {
const allocator = std.testing.allocator;
}
创建竞技场分配器也经常有用。 .free()
在 arena 分配器上什么都不做,相反,当 arena 分配器被销毁时,放入 arena 分配器的所有内容都会立即释放。这可以使适用于您的应用程序部分的内存管理更轻松、更快速。
const allocator = ... pick an allocator;
var arena_allocator = std.heap.ArenaAllocator.init(allocator);
defer arena_allocator.deinit();
const arena = &arena_allocator.allocator;
如何动态分配内存 space 并获取指向 Zig 中结构列表的指针。
就像在 C 中一样:
struct Foo* my_array_of_foo = (struct Foo*) malloc(10*sizeof(Foo));
const allocator: *std.mem.Allocator = std.heap.page_allocator; // this is not the best choice of allocator, see below.
const my_slice_of_foo: []Foo = try allocator.alloc(Foo, 10);
defer allocator.free(my_slice_of_foo);
这将分配一个长度为 10 的切片。稍后可以使用 allocator.free(my_slice_of_foo)
在 zig 中,数组通常表示为包含指针和项数的切片 (struct {ptr: [*]type, len: usize}
)。分配器有一个函数 .create(type)
为单个值分配 space 和 return 一个指针,还有一个函数 .alloc(type, count)
分配一个连续的数组和 return 一个切片.
std.heap.page_allocator
不是此类任务的分配器的最佳选择。我建议使用通用分配器,它可以为您捕获内存泄漏,更容易找到释放后使用错误,并更有效地使用内存:
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer std.debug.assert(!gpa.deinit());
const allocator = &gpa.allocator;
}
在测试中,最好使用测试分配器,它提供与通用分配器相同的安全功能,但由测试工具为您处理:
test "allocate stuff" {
const allocator = std.testing.allocator;
}
创建竞技场分配器也经常有用。 .free()
在 arena 分配器上什么都不做,相反,当 arena 分配器被销毁时,放入 arena 分配器的所有内容都会立即释放。这可以使适用于您的应用程序部分的内存管理更轻松、更快速。
const allocator = ... pick an allocator;
var arena_allocator = std.heap.ArenaAllocator.init(allocator);
defer arena_allocator.deinit();
const arena = &arena_allocator.allocator;