生命周期与所有权 (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
}

defererrdefer

defererrdefer 语句是 Zig 中管理资源生命周期的关键工具:

  • defer: 确保在当前代码块退出时执行指定的清理操作,无论是否发生错误。
  • errdefer: 仅在当前代码块以错误方式退出时执行指定的清理操作。

指针安全

由于没有借用检查器,程序员需要负责确保指针的有效性。

  • 不要使用悬垂指针(Dangling Pointers)。
  • 不要多次释放同一块内存。
  • 确保在内存被释放后不再访问它。

Zig 的哲学

Zig 在内存管理方面倾向于给予程序员完全的控制权,并期望程序员通过明确的代码和测试来保证程序的正确性。运行时安全检查(在 Debug 和 ReleaseSafe 模式下)可以帮助捕获一些常见的内存错误。

另请参阅: