Skip to content

update: update gpa to DebugAllocator in learn module#119

Open
lennlouisgeek wants to merge 5 commits into
zigcc:mainfrom
lennlouisgeek:main
Open

update: update gpa to DebugAllocator in learn module#119
lennlouisgeek wants to merge 5 commits into
zigcc:mainfrom
lennlouisgeek:main

Conversation

@lennlouisgeek

Copy link
Copy Markdown

Removestd.heap.GeneralPurposeAllocator,update to std.heap.DebugAllocator in learn module.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the Zig tutorial documentation to replace the deprecated GeneralPurposeAllocator with the new DebugAllocator for Zig 0.16.0. However, the reviewer identified a widespread syntax error: std.heap.DebugAllocator is a struct rather than a generic function, meaning that initializing it with (.{}){} will result in a compilation error; it should be initialized directly as std.heap.DebugAllocator{}. Additionally, several explanations and Chinese translations in the documentation still incorrectly describe it as a generic function or refer to it as the "General Purpose Allocator" and need to be corrected.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread content/learn/coding-in-zig.smd Outdated
Comment on lines +23 to +24
var dpa = std.heap.DebugAllocator(.{}){};
const allocator = dpa.allocator();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

In Zig, std.heap.DebugAllocator is a struct, not a generic function that takes a configuration parameter. Therefore, calling it with (.{}) is a compile error. It should be initialized directly as std.heap.DebugAllocator{}.

	var dpa = std.heap.DebugAllocator{};
	const allocator = dpa.allocator();

Comment thread content/learn/coding-in-zig.smd Outdated
Comment on lines +79 to +80
var dpa = std.heap.DebugAllocator(.{}){};
const allocator = dpa.allocator();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

In Zig, std.heap.DebugAllocator is a struct, not a generic function that takes a configuration parameter. Therefore, calling it with (.{}) is a compile error. It should be initialized directly as std.heap.DebugAllocator{}.

	var dpa = std.heap.DebugAllocator{};
	const allocator = dpa.allocator();

Comment thread content/learn/coding-in-zig.smd Outdated
Comment on lines +119 to +120
var dpa = std.heap.DebugAllocator(.{}){};
const allocator = dpa.allocator();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

In Zig, std.heap.DebugAllocator is a struct, not a generic function that takes a configuration parameter. Therefore, calling it with (.{}) is a compile error. It should be initialized directly as std.heap.DebugAllocator{}.

	var dpa = std.heap.DebugAllocator{};
	const allocator = dpa.allocator();

Comment thread content/learn/coding-in-zig.smd Outdated
Comment on lines +233 to +234
var dpa = std.heap.DebugAllocator(.{}){};
const allocator = dpa.allocator();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

In Zig, std.heap.DebugAllocator is a struct, not a generic function that takes a configuration parameter. Therefore, calling it with (.{}) is a compile error. It should be initialized directly as std.heap.DebugAllocator{}.

	var dpa = std.heap.DebugAllocator{};
	const allocator = dpa.allocator();

Comment thread content/learn/coding-in-zig.smd Outdated
Comment on lines +300 to +301
var dpa = std.heap.DebugAllocator(.{}){};
const allocator = dpa.allocator();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

In Zig, std.heap.DebugAllocator is a struct, not a generic function that takes a configuration parameter. Therefore, calling it with (.{}) is a compile error. It should be initialized directly as std.heap.DebugAllocator{}.

	var dpa = std.heap.DebugAllocator{};
	const allocator = dpa.allocator();

Comment thread content/learn/heap-memory.smd Outdated
Comment on lines 287 to 298
你可能会注意到,创建 `dpa` 的语法有点奇怪。什么是`DebugAllocator(.{}){}`?

我们之前见过这些东西,只是现在都混合了起来。`std.heap.GeneralPurposeAllocator` 是一个函数,由于它使用的是 `PascalCase`(帕斯卡命名法),我们知道它返回一个类型。(下一部分会更多讨论泛型)。也许这个更明确的版本会更容易解读:
我们之前见过这些东西,只是现在都混合了起来。`std.heap.DebugAllocator` 是一个函数,由于它使用的是 `PascalCase`(帕斯卡命名法),我们知道它返回一个类型。(下一部分会更多讨论泛型)。也许这个更明确的版本会更容易解读:

```zig
const T = std.heap.GeneralPurposeAllocator(.{});
var gpa = T{};
const T = std.heap.DebugAllocator(.{});
var dpa = T{};

// 等同于:

var gpa = std.heap.GeneralPurposeAllocator(.{}){};
var dpa = std.heap.DebugAllocator(.{}){};
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Since std.heap.DebugAllocator is a struct and not a generic function, the explanation about DebugAllocator(.{}){} being a function that returns a type is incorrect and misleading. We should update this section to explain that it is a simple struct initialized with {}.

Note that since DebugAllocator is a simple struct and does not use std.heap.general_purpose_allocator.Config, the subsequent paragraph (around line 302 in the original file) explaining Config and default values is also obsolete and should be removed or updated in a separate change.

Suggested replacement:

创建 dpa 的语法非常简单:std.heap.DebugAllocator{}。因为 DebugAllocator 是一个结构体(struct),而不是像以前的 GeneralPurposeAllocator 那样是一个返回类型的泛型函数,所以我们不需要传递配置参数,直接实例化即可:

var dpa = std.heap.DebugAllocator{};

## [std.testing.allocator]($heading.id('std-testing-allocator'))

希望当我们谈到内存泄漏时,你已经足够烦恼,而当我提到 Zig 可以提供帮助时,你肯定渴望了解更多这方面内容。这种帮助来自 `std.testing.allocator`,它是一个 `std.mem.Allocator` 实现。目前,它基于通用分配器(GeneralPurposeAllocator)实现,并与 Zig 的测试运行器进行了集成,但这只是实现细节。重要的是,如果我们在测试中使用 `std.testing.allocator`,就能捕捉到大部分内存泄漏。
希望当我们谈到内存泄漏时,你已经足够烦恼,而当我提到 Zig 可以提供帮助时,你肯定渴望了解更多这方面内容。这种帮助来自 `std.testing.allocator`,它是一个 `std.mem.Allocator` 实现。目前,它基于通用分配器(DebugAllocator)实现,并与 Zig 的测试运行器进行了集成,但这只是实现细节。重要的是,如果我们在测试中使用 `std.testing.allocator`,就能捕捉到大部分内存泄漏。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The Chinese text still refers to DebugAllocator as "通用分配器" (General Purpose Allocator). It should be updated to "调试分配器" (Debug Allocator) to match the new allocator name.

Suggested replacement:

希望当我们谈到内存泄漏时,你已经足够烦恼,而当我提到 Zig 可以提供帮助时,你肯定渴望了解更多这方面内容。这种帮助来自 std.testing.allocator,它是一个 std.mem.Allocator 实现。目前,它基于调试分配器(DebugAllocator)实现,并与 Zig 的测试运行器进行了集成,但这只是实现细节。重要的是,如果我们在测试中使用 std.testing.allocator,就能捕捉到大部分内存泄漏。

Comment thread content/learn/heap-memory.smd Outdated
Comment on lines +356 to +357
var dpa = std.heap.DebugAllocator(.{}){};
const allocator = dpa.allocator();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

In Zig, std.heap.DebugAllocator is a struct, not a generic function that takes a configuration parameter. Therefore, calling it with (.{}) is a compile error. It should be initialized directly as std.heap.DebugAllocator{}.

	var dpa = std.heap.DebugAllocator{};
	const allocator = dpa.allocator();

Comment thread content/learn/heap-memory.smd Outdated
Comment on lines +482 to +483
var dpa = std.heap.DebugAllocator(.{}){};
const allocator = dpa.allocator();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

In Zig, std.heap.DebugAllocator is a struct, not a generic function that takes a configuration parameter. Therefore, calling it with (.{}) is a compile error. It should be initialized directly as std.heap.DebugAllocator{}.

var dpa = std.heap.DebugAllocator{};
const allocator = dpa.allocator();

Comment thread content/learn/heap-memory.smd Outdated
Comment on lines +492 to +493
var dpa = std.heap.DebugAllocator(.{}){};
const allocator = dpa.allocator();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

In Zig, std.heap.DebugAllocator is a struct, not a generic function that takes a configuration parameter. Therefore, calling it with (.{}) is a compile error. It should be initialized directly as std.heap.DebugAllocator{}.

var dpa = std.heap.DebugAllocator{};
const allocator = dpa.allocator();

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the learn-module documentation examples to stop using std.heap.GeneralPurposeAllocator and instead demonstrate std.heap.DebugAllocator, aligning the tutorial with newer Zig standard library allocator naming/usage.

Changes:

  • Replaced GeneralPurposeAllocator usages in code snippets with DebugAllocator (gpadpa) across learn articles.
  • Updated headings and explanatory text in the heap-memory lesson to describe DebugAllocator.
  • Adjusted allocator-related examples and surrounding narrative to match the new allocator choice.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.

File Description
content/learn/heap-memory.smd Updates allocator section (heading, narrative, and multiple code snippets) to use DebugAllocator instead of GeneralPurposeAllocator.
content/learn/generics.smd Updates the allocator instantiation in the generics example to use DebugAllocator.
content/learn/coding-in-zig.smd Updates multiple code examples to use DebugAllocator in place of GeneralPurposeAllocator.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread content/learn/heap-memory.smd Outdated
Comment on lines +292 to 296
const T = std.heap.DebugAllocator(.{});
var dpa = T{};

// 等同于:

Comment thread content/learn/heap-memory.smd
Comment thread content/learn/heap-memory.smd
@jiacai2050

Copy link
Copy Markdown
Member

请按照英文原文进行适配,那边已经适配0.16了

@lennlouisgeek

Copy link
Copy Markdown
Author

Fixed, please review again.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 6 out of 6 changed files in this pull request and generated 14 comments.

Comment on lines +106 to +109
fn classify(power_level: u32) ![]const u8 {
var buf: [20]u8 = undefined;
return std.fmt.bufPrint(&buf, "over: {d}\n", .{power_level});
}
Comment on lines +375 to +377
var buf: [20]u8 = undefined;
const msg = try std.fmt.bufPrint(&buf, "over: {d}!\n", .{power_level});
std.debug.print("{s}\n" , .{msg});
```

上述代码仍然创建了一个 16 字节的数组,但它的每个元素都没有被赋值。
上述代码仍然创建了一个 20 字节的数组,但它的每个元素都没有被赋值。
```zig
pub fn main() void {
std.debug.print("{any}\n", .{@TypeOf(.{.year = 2023, .month = 8})});
std.debug.print("{}\n", .{.{.year = 2023, .month = 8}});
Comment on lines +44 to +47
// TODO: use a proper seed, not 0.
var prng = std.Random.DefaultPrng.init(0);
const random = prng.random();
return random.uintAtMost(u8, 5) + 5;
## [std.testing.allocator]($heading.id('std-testing-allocator'))

希望当我们谈到内存泄漏时,你已经足够烦恼,而当我提到 Zig 可以提供帮助时,你肯定渴望了解更多这方面内容。这种帮助来自 `std.testing.allocator`,它是一个 `std.mem.Allocator` 实现。目前,它基于通用分配器(GeneralPurposeAllocator)实现,并与 Zig 的测试运行器进行了集成,但这只是实现细节。重要的是,如果我们在测试中使用 `std.testing.allocator`,就能捕捉到大部分内存泄漏。
希望当我们谈到内存泄漏时,你已经足够烦恼,而当我提到 Zig 可以提供帮助时,你肯定渴望了解更多这方面内容。这种帮助来自 `std.testing.allocator`,它是一个 `std.mem.Allocator` 实现。目前,它基于通用分配器(DebugAllocator)实现,并与 Zig 的测试运行器进行了集成,但这只是实现细节。重要的是,如果我们在测试中使用 `std.testing.allocator`,就能捕捉到大部分内存泄漏。
const builtin = @import("builtin");

pub fn main() !void {
var gpa: std.heap.DebugAllocator(.{}) = .empty;
```

值看起来没问题,但键不一样。如果你不确定发生了什么,那可能是我的错。之前,我故意误导了你的注意力。我说哈希表通常声明周期会比较长,因此需要同等生命周期的值(value)。事实上,哈希表不仅需要长生命周期的值,还需要长生命周期的键(key)!请注意,`buf` 是在 `while` 循环中定义的。当我们调用 `put` 时,我们给了哈希表插入一个键值对,这个键的生命周期比哈希表本身短得多。将 `buf` 移到 `while` 循环之外可以解决生命周期问题,但每次迭代都会重复使用缓冲区。由于我们正在更改底层的键数据,因此它仍然无法工作。
值看起来没问题,但键不一样。如果你不确定发生了什么,那可能是我的错。之前,我故意误导了你的注意力。我说哈希表通常生命周期会比较长,因此需要同等生命周期的值(value)。事实上,哈希表不仅需要长生命周期的值,还需要长生命周期的键(key)!请注意,`buf` 是在 `while` 循环中定义的。当我们调用 `put` 时,我们给了哈希表插入一个键值对,这个键的生命周期比哈希表本身短得多。将 `buf` 移到 `while` 循环之外可以解决生命周期问题,但每次迭代都会重复使用缓冲区。由于我们正在更改底层的键数据,因此它仍然无法工作。
Comment on lines +354 to 355
但是如果我们传递一个实现了`writeAll`函数的`*std.Io.Writer`对象,代码就能正常运行

```bash
User 1 has power of 10
User 2 has power of 20
over 9000\n
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants