diff --git a/lib/std/heap/general_purpose_allocator.zig b/lib/std/heap/general_purpose_allocator.zig index d366f8572e..44417e174a 100644 --- a/lib/std/heap/general_purpose_allocator.zig +++ b/lib/std/heap/general_purpose_allocator.zig @@ -561,11 +561,13 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type { } self.total_requested_bytes = new_req_bytes; } - errdefer if (config.enable_memory_limit) { - self.total_requested_bytes = prev_req_bytes; - }; - const result_len = self.backing_allocator.rawResize(old_mem, old_align, new_size, len_align, ret_addr) orelse return null; + const result_len = self.backing_allocator.rawResize(old_mem, old_align, new_size, len_align, ret_addr) orelse { + if (config.enable_memory_limit) { + self.total_requested_bytes = prev_req_bytes; + } + return null; + }; if (config.enable_memory_limit) { entry.value_ptr.requested_size = new_size; @@ -623,6 +625,10 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type { }); } + if (!config.never_unmap) { + self.backing_allocator.rawFree(old_mem, old_align, ret_addr); + } + if (config.enable_memory_limit) { self.total_requested_bytes -= entry.value_ptr.requested_size; } @@ -711,9 +717,6 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type { } self.total_requested_bytes = new_req_bytes; } - errdefer if (config.enable_memory_limit) { - self.total_requested_bytes = prev_req_bytes; - }; const new_aligned_size = math.max(new_size, old_align); const new_size_class = math.ceilPowerOfTwoAssert(usize, new_aligned_size); @@ -728,6 +731,10 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type { } return new_size; } + + if (config.enable_memory_limit) { + self.total_requested_bytes = prev_req_bytes; + } return null; }