From f7e12ef9a95f04e77b09352f223d1a9c114376b4 Mon Sep 17 00:00:00 2001 From: Nathaniel Walizer Date: Thu, 16 Jan 2025 03:00:57 -0800 Subject: [PATCH] Various memory leak fixes --- src/cart.c | 4 ++++ src/nese.c | 9 +++++---- src/overlay.c | 11 +++++++++++ src/overlay.h | 1 + src/sdl_render.c | 6 ++++-- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/cart.c b/src/cart.c index bc85850..dbaebfe 100644 --- a/src/cart.c +++ b/src/cart.c @@ -70,6 +70,10 @@ int nes_cart_init_mem(nes_cart* cart, void* mem, int len) { } void nes_cart_done(nes_cart* cart) { + if (NULL != cart->mapper) { + nes_map_done(cart->mapper); + cart->mapper = NULL; + } if (NULL != cart->ines_mem) { unmap_file(cart->ines_mem, cart->ines_size); cart->ines_mem = NULL; diff --git a/src/nese.c b/src/nese.c index 1dac941..b7e8fc6 100644 --- a/src/nese.c +++ b/src/nese.c @@ -124,7 +124,7 @@ static int select_rom(menu_state* menu, nes_Renderer* rend, nes_cart new_cart = {0}; while (0 == status && NULL == cart.file) { - // Display a load failure message? + // Display a load failure message if (NULL != cart.filename) { char message[1024]; snprintf(message, sizeof(message) - 1, @@ -134,10 +134,11 @@ static int select_rom(menu_state* menu, nes_Renderer* rend, // Program closed inside modal status = input_Result_Quit; } + free(cart.filename); + cart.filename = NULL; } if (0 == status) { - // If we didn't launch with a file, run the loader cart.filename = run_main_menu(menu, rend, input, sys); @@ -226,9 +227,9 @@ int main(int argc, char* argv[]) { } } - menu_state main_menu = {0}; + // If we didn't launch with a file, run the loader if (0 == status && NULL == cart.file) { - status = select_rom(&main_menu, rend, input, + status = select_rom(NULL, rend, input, &sys, &cart); } diff --git a/src/overlay.c b/src/overlay.c index e9b0eeb..e5a3e23 100644 --- a/src/overlay.c +++ b/src/overlay.c @@ -10,6 +10,17 @@ int overlay_init(Overlay* overlay) { return 0; } +void overlay_done(Overlay* overlay) { + overlay_message* next = NULL; + for ( overlay_message* message = overlay->messages; + NULL != message; + message = next) { + next = message->next; + free(message->string); + free(message); + } +} + int overlay_clear(Overlay* overlay) { int n_cleared = 0; for ( overlay_message* message = overlay->messages; diff --git a/src/overlay.h b/src/overlay.h index 712bd5b..a675ada 100644 --- a/src/overlay.h +++ b/src/overlay.h @@ -17,6 +17,7 @@ typedef struct { int overlay_init(Overlay*); +void overlay_done(Overlay*); int overlay_add_message(Overlay*, const char*, int expiry); int overlay_clear_message(Overlay*, int id); int overlay_clear(Overlay*); diff --git a/src/sdl_render.c b/src/sdl_render.c index ae5351e..d4fe204 100644 --- a/src/sdl_render.c +++ b/src/sdl_render.c @@ -43,8 +43,9 @@ typedef struct { SDL_Surface* background; SDL_Surface* foreground; SDL_Surface* target; - SDL_Texture* texture; sdl_overlay_font font; + + SDL_Texture* texture; int win_w; int win_h; } sdl_render_data; @@ -95,7 +96,6 @@ static int sdl_render_init(nes_Renderer* rend) { } else { overlay_init(&rend->overlay); - // TODO: Cleanup sdl_overlay_font_init(data->renderer, &data->font); } } @@ -169,6 +169,8 @@ static int sdl_render_init(nes_Renderer* rend) { static void sdl_render_done(nes_Renderer* rend) { sdl_render_data* data = (sdl_render_data*)rend->data; + overlay_done(&rend->overlay); + sdl_overlay_font_done(&data->font); SDL_DestroyTexture(data->texture); SDL_FreeSurface(data->foreground); SDL_FreeSurface(data->background);