分配器接口
为所有内存来源提供统一契约。
分配器接口 是 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 反馈 — 无需本地设置。