fix: memory leak from snapshot/undo system
parent
80caf66884
commit
b82fdbca00
22
src/main.zig
22
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 {
|
||||
|
|
Loading…
Reference in New Issue