内存管理 (Memory Management)
Zig 是一种系统编程语言,没有垃圾回收器。内存管理是显式的,通常通过分配器(allocator)来完成。
选择一个分配器 (Choosing an Allocator)
分配器是实现特定接口的对象,用于分配和释放内存。标准库提供了多种分配器:
std.heap.page_allocator: 这是操作系统提供的原始内存分配器,按页面(通常为 4KB)分配内存。std.heap.GeneralPurposeAllocator: 一个通用的堆分配器,适合大多数典型的堆使用场景。它提供了更细粒度的分配,并且有调试功能。std.heap.ArenaAllocator: 一种竞技场分配器,用于分配大量生命周期相同的小块内存。所有分配的内存在竞技场被销毁时一次性释放,效率很高。std.heap.FixedBufferAllocator: 在预先提供的固定大小缓冲区上进行分配。
分配器接口
所有分配器都必须实现 std.mem.Allocator 接口,它通常包括 alloc、resize 和 free 方法。
// 示例:使用一个分配器
const std = @import("std");
const allocator = std.heap.page_allocator; // 或者其他分配器
test "allocator usage" {
var buffer = try allocator.alloc(u8, 100); // 分配 100 个 u8
defer allocator.free(buffer); // 确保内存被释放
buffer[0] = 'H';
buffer[1] = 'i';
// ...
}
堆分配失败 (Heap Allocation Failure)
内存分配函数通常返回一个错误联合(!T),允许调用者显式地处理分配失败(例如内存不足错误 error.OutOfMemory)。
fn allocateSomething() ![]u8 {
const data = try allocator.alloc(u8, 1024);
// ...
return data;
}
递归 (Recursion)
Zig 语言本身支持递归。但是,由于 Zig 是一种系统语言,堆栈空间是有限的。对于深度递归,可能会发生堆栈溢出。
生命周期和所有权 (Lifetime and Ownership)
Zig 没有像 Rust 那样的所有权系统。程序员需要手动管理内存的生命周期。defer 和 errdefer 语句是管理资源的重要工具。