Fixed memory leak in dynamic array.

This commit is contained in:
Warwick 2024-12-18 15:04:26 +00:00
parent 9f50fdbe7f
commit 8444f0c94a
2 changed files with 17 additions and 31 deletions

View file

@ -1,5 +1,6 @@
// Special thanks to https://bytesbeneath.com/p/dynamic-arrays-in-c
#include "dyn_arr.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -12,6 +13,7 @@ void *dyn_arr_init(size_t item_size, size_t capacity) {
dyna_header *header = malloc(size);
if (header) {
header->item_size = item_size;
header->capacity = capacity;
header->length = 0;
dyna_ptr = header + 1;
@ -20,11 +22,15 @@ void *dyn_arr_init(size_t item_size, size_t capacity) {
return dyna_ptr;
}
void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size) {
void *dyna_ensure_capacity(void *array, int64_t item_count) {
size_t item_size = dyna_item_size(array);
dyna_header *header = dyna_get_header(array);
size_t minimum_capacity = header->length + item_count;
size_t maximum_capacity =
header->length + item_count * ARRAY_GROWTH_MULTIPLIER;
if (header->capacity > minimum_capacity) {
if (header->capacity > minimum_capacity &&
header->capacity < maximum_capacity) {
return header + 1;
}
@ -39,31 +45,9 @@ void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size) {
return header + 1;
}
void dyn_arr_pop(void *array, size_t item_size) {
if (dyna_empty(array)) {
return;
}
dyna_length(array)--;
// Shrink if smaller than growth factor, may break if growth factor is > 2
if (dyna_length(array) >
(2 - ARRAY_GROWTH_MULTIPLIER) * dyna_capacity(array)) {
return;
}
size_t new_capacity = dyna_length(array) * ARRAY_GROWTH_MULTIPLIER;
dyna_capacity(array) = new_capacity;
size_t new_size = sizeof(dyna_header) + new_capacity * item_size;
dyna_header *header = dyna_get_header(array);
header = realloc(dyna_get_header(array), new_size);
}
void dyna_deinit(void *array) {
dyna_header *header = dyna_get_header(array);
header = NULL;
free(dyna_get_header(array));
array = NULL;
}
bool dyna_empty(void *array) {

View file

@ -13,7 +13,6 @@
* - clear aka erase
* - insert
* - (optional) insert range
* - pop
* - (optional) swap
* - (optional) resize
* - Sanity checks
@ -22,6 +21,7 @@
*/
typedef struct dyna_header {
size_t item_size;
size_t capacity;
size_t length;
} dyna_header;
@ -32,19 +32,21 @@ void *dyn_arr_init(size_t item_size, size_t capacity);
// Modification
#define dyna_append(array, value) \
((array) = dyna_ensure_capacity(array, 1, sizeof(value)), \
((array) = dyna_ensure_capacity(array, 1), \
(array)[dyna_get_header(array)->length] = (value), \
&(array)[dyna_get_header(array)->length++])
void *dyna_ensure_capacity(void *array, size_t item_count, size_t item_size);
void *dyna_ensure_capacity(void *array, int64_t item_count);
#define dyna_pop(array) dyn_arr_pop(array, sizeof(typeof(*array)))
void dyn_arr_pop(void *array, size_t item_size);
#define dyna_pop(array) \
((array) = dyna_ensure_capacity(array, -1), \
&(array)[dyna_get_header(array)->length--])
void dyna_deinit(void *array);
// Get meta data
#define dyna_get_header(array) ((dyna_header *)(array) - 1)
#define dyna_item_size(array) (dyna_get_header(array)->item_size)
#define dyna_length(array) (dyna_get_header(array)->length)
#define dyna_capacity(array) (dyna_get_header(array)->capacity)
bool dyna_empty(void *array);