0Pricing
Zig Academy · 课时

分配器接口

为所有内存来源提供统一契约。

分配器接口 是 CoddyKit 上的免费 Zig Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Zig Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Zig Academy 课程共包含 4 节课。

一种常见类型

Zig 中的每个分配器都会以同一种类型 std.mem.Allocator 传递。您的代码只与这个接口交互,而不会接触具体的后端实现。

const Allocator = std.mem.Allocator;

接口,而不是类

std.mem.Allocator 是一个小型接口:由一个指针和一个函数表组成。它描述分配器能做什么,而不是规定您使用哪一个分配器。

多个后端,同一种形状

页分配器、区域分配器或测试分配器都公开相同的形状。将其中一个替换为另一个,无需修改调用代码。

获取实际的分配器

您先获取一个具体的分配器,然后使用它的 .allocator() 句柄,将其作为通用的 std.mem.Allocator 类型传递。

var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const a = gpa.allocator();

向下传递

一旦持有分配器,您就可以将这个值传入任何需要内存的函数。整个程序可以共享同一个来源。

try doWork(a);

页分配器

std.heap.page_allocator 会直接向 OS 请求内存。它简单但粒度较粗,因此适合较大或生命周期较长的内存块,而不适合很小的内存块。

const a = std.heap.page_allocator;

GeneralPurposeAllocator

在调试构建中,GeneralPurposeAllocator 是日常使用的选择。它会跟踪每个内存块,并为您报告内存泄漏和重复释放。

接口为何有用

面向接口编程意味着您的函数可以使用任何分配器。同一份代码可以运行在测试中、裸机上或服务器中。

函数只需提出请求

函数并不关心它获得的是哪一个分配器。它只需在传入的 std.mem.Allocator 上调用 alloc 和 free 等方法。

const buf = try a.alloc(u8, 16);

没有全局分配器

Zig 没有单一的全局堆。您可以决定程序的每个部分使用哪个分配器,从而让内存来源清晰可见并保持局部性。

使用另一个分配器进行测试

在测试中,您可以改用 std.testing.allocator。代码不变,但现在内存泄漏会使测试失败,证明了接口的价值。✅

快速检查

想一想,所有 Zig 分配器共享的类型是什么。

回顾

您已经学会,std.mem.Allocator 是覆盖多个后端的统一接口,因此请求内存的代码可以使用您提供的任何分配器。🎯

常见问题解答

「分配器接口」课时是免费的吗?

是的 — 「分配器接口」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Zig Academy 课程的其余内容,请升级到 CoddyKit PRO。 Zig Academy 课程共包含 4 节课。

「分配器接口」这节课中我会学到什么?

为所有内存来源提供统一契约。 你通过在浏览器中直接运行的动手代码来练习 Zig Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Zig Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Zig Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「分配器接口」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Zig Academy 课中编写并运行代码吗?

能。每节 Zig Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为何 Zig 没有隐藏的内存分配
  2. 分配器接口
  3. alloc、free、create、destroy
  4. 使用 ArrayList 管理动态列表
← 返回 Zig Academy