生命周期与所有权 (Lifetime and Ownership)
与 Rust 等语言不同,Zig 没有内置的所有权(Ownership)或借用检查器(Borrow Checker)机制。在 Zig 中,内存的生命周期和资源的拥有权完全由程序员手动管理。
手动管理内存
你需要使用分配器(allocator)来分配内存,并确保在使用完毕后手动释放它。
const std = @import("std");
fn createBuffer(allocator: std.mem.Allocator) ![]u8 {
const buffer = try allocator.alloc(u8, 1024);
// ...
return buffer;
}
pub fn main() !void {
const buffer = try createBuffer(std.heap.page_allocator);
defer std.heap.page_allocator.free(buffer);
// 使用 buffer
}
defer 和 errdefer
defer 和 errdefer 语句是 Zig 中管理资源生命周期的关键工具:
defer: 确保在当前代码块退出时执行指定的清理操作,无论是否发生错误。errdefer: 仅在当前代码块以错误方式退出时执行指定的清理操作。
指针安全
由于没有借用检查器,程序员需要负责确保指针的有效性。
- 不要使用悬垂指针(Dangling Pointers)。
- 不要多次释放同一块内存。
- 确保在内存被释放后不再访问它。
Zig 的哲学
Zig 在内存管理方面倾向于给予程序员完全的控制权,并期望程序员通过明确的代码和测试来保证程序的正确性。运行时安全检查(在 Debug 和 ReleaseSafe 模式下)可以帮助捕获一些常见的内存错误。