const std = @import("std"); const Allocator = std.mem.Allocator; const Foo = struct { data: *u32 }; fn getData() !u32 { return 666; } fn genFoos(allocator: Allocator, num: usize) ![]Foo { const foos = try allocator.alloc(Foo, num); errdefer allocator.free(foos); // Used to track how many foos have been initialized // (including their data being allocated) var num_allocated: usize = 0; errdefer for (foos[0..num_allocated]) |foo| { allocator.destroy(foo.data); }; for (foos, 0..) |*foo, i| { foo.data = try allocator.create(u32); num_allocated += 1; if (i >= 3) return error.TooManyFoos; foo.data.* = try getData(); } return foos; } test "genFoos" { try std.testing.expectError(error.TooManyFoos, genFoos(std.testing.allocator, 5)); } // test