From b82fdbca001e28abad5374fd458abaedb438d9ac Mon Sep 17 00:00:00 2001 From: geemili Date: Tue, 23 Apr 2024 22:17:35 -0600 Subject: [PATCH] fix: memory leak from snapshot/undo system --- src/main.zig | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main.zig b/src/main.zig index 74f19cc..61f086d 100644 --- a/src/main.zig +++ b/src/main.zig @@ -111,6 +111,7 @@ pub fn init(context: *seizer.Context) !void { } fn resetGame() !void { + resetHistory(); draw_pile.deinit(gpa); draw_pile_exhausted = false; drawn_cards.shrinkRetainingCapacity(0); @@ -151,6 +152,11 @@ fn resetHistory() void { fn destroy(window: *seizer.Window) void { _ = window; + for (history.items) |*snapshot| { + snapshot.deinit(); + } + history.deinit(gpa); + draw_pile.deinit(gpa); drawn_cards.deinit(gpa); for (&stacks) |*stack| { @@ -454,7 +460,7 @@ pub fn doSelectOrPlace(pressed: bool) !void { } } } else if (hovered_deck == selected_deck) { - const snapshot = try Snapshot.initFromCurrentGlobalState(); + var snapshot = try Snapshot.initFromCurrentGlobalState(); const selected_substack = selected_deck.?.items[selected_card..]; // try to move all selected cards into the foundations @@ -488,12 +494,14 @@ pub fn doSelectOrPlace(pressed: bool) !void { if (cards_moved) { try history.append(gpa, snapshot); + } else { + snapshot.deinit(); } selected_deck = null; } else { var cards_moved = false; - const snapshot = try Snapshot.initFromCurrentGlobalState(); + var snapshot = try Snapshot.initFromCurrentGlobalState(); if (selected_deck) |selected| move_from_selected_to_hovered: { const selected_substack = selected.items[selected_card..]; if (selected_substack.len == 0) break :move_from_selected_to_hovered; @@ -516,7 +524,7 @@ pub fn doSelectOrPlace(pressed: bool) !void { hovered.ensureUnusedCapacity(gpa, 1) catch break :move_from_selected_to_hovered; hovered.appendAssumeCapacity(selected_deck.?.pop()); hovered_card = indexOfTopOfStack(hovered_deck.?.items); - try history.append(gpa, snapshot); + cards_moved = true; break :move_from_selected_to_hovered; } else for (foundations[0..]) |*foundation| { if (foundation != selected) continue; @@ -550,6 +558,8 @@ pub fn doSelectOrPlace(pressed: bool) !void { } if (cards_moved) { try history.append(gpa, snapshot); + } else { + snapshot.deinit(); } selected_deck = null; } @@ -778,6 +788,12 @@ const Snapshot = struct { pub fn deinit(snapshot: *@This()) void { gpa.free(snapshot.draw_pile); gpa.free(snapshot.drawn_cards); + for (snapshot.stacks) |stack| { + gpa.free(stack); + } + for (snapshot.foundations) |foundation| { + gpa.free(foundation); + } } pub fn restore(snapshot: @This()) !void {