From cc153bd481c0c0e89a44c5cff33772d8fb609390 Mon Sep 17 00:00:00 2001 From: Chris Cromer Date: Tue, 6 Jul 2021 23:47:19 -0400 Subject: [PATCH] add memory cleanup at exit --- src/include/array.h | 5 +++++ src/loop.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/include/array.h b/src/include/array.h index cdf048a..23a70d3 100644 --- a/src/include/array.h +++ b/src/include/array.h @@ -22,6 +22,11 @@ typedef struct { size_t size; } StringArray; +typedef struct { + void **array; + size_t size; +} CleanArray; + void create_string_array(StringArray *string_array); void insert_string_array(StringArray *string_array, char *string); diff --git a/src/loop.c b/src/loop.c index 67b8105..15cdf18 100644 --- a/src/loop.c +++ b/src/loop.c @@ -22,10 +22,39 @@ #include "console_line.h" #include "launch.h" +static CleanArray clean; + +/** + * Add memory address to array to be cleaned up later. + * @param data The data to be cleaned up on exit. + */ +void add_to_cleanup(void *data) { + clean.array = realloc(clean.array, (clean.size + 1) * sizeof(void *)); + clean.array[clean.size++] = data; +} + +/** + * Cleanup memory when exiting. + */ +void exit_cleanup() { + for (size_t i = 0; i < clean.size; i++) { + if (clean.array[i] != NULL) { + free(clean.array[i]); + clean.array[i] = NULL; + } + } + if (clean.array != NULL) { + free(clean.array); + clean.array = NULL; + } +} + /** * This is the loop that checks for user input and acts on it. */ void loop() { + clean.size = 0; + atexit(exit_cleanup); while (1) { print_input_line();