std.ArrayList
我正在尝试使用多个s构建一片切片。
下面的代码有效,但内存分配器std.testing.allocator
会警告我在将新元素附加到sublist
.
const std = @import("std");
const mem = std.mem;
fn sliceOfSlices(allocator: *mem.Allocator) ![][]usize {
var list = std.ArrayList([]usize).init(allocator);
var i: usize = 0;
while (i < 3) : (i += 1) {
var sublist = std.ArrayList(usize).init(allocator);
// errdefer sublist.deinit(); // here?
var n: usize = 0;
while (n < 5) : (n += 1) {
try sublist.append(n); // leaks
// errdefer sublist.deinit(); // here?
// errdefer allocator.free(sublist.items);
}
try list.append(sublist.toOwnedSlice());
}
return list.toOwnedSlice();
}
const testing = std.testing;
test "memory leaks" {
const slice = try sliceOfSlices(testing.allocator);
testing.expectEqual(@intCast(usize, 3), slice.len);
testing.expectEqual(@intCast(usize, 5), slice[0].len);
}
我尝试errdefer
在几个地方使用来释放已分配的sublist
,但没有奏效。从文档来看,这似乎是一个终身问题,但我不知道如何处理它。
std.ArrayList(T).items 切片的生命周期保持有效,直到下次调整列表大小时,例如通过附加新元素。— https://ziglang.org/documentation/master/#Lifetime-and-Ownership
list.append()
失败时适当的错误处理是什么?