Я пытаюсь реализовать «мою» версию безопасного массива в C, и у меня есть проблема утечки памяти, когда я пытаюсь освободить мою структуру, которую я создал, и я не могу понять, проблема.Свободная память для struct corrupt heap
#include <stdio.h>
#include <stdlib.h>
typedef struct safe_array safe_array;
struct safe_array
{
size_t size;
int * safe_array;
};
void init_array(safe_array* safe_array, size_t size, int initial_value)
{
safe_array->safe_array = malloc(sizeof(int) * size);
for (size_t i = 0; i < size; i++)
{
safe_array->safe_array[i] = initial_value;
}
safe_array->size = size;
}
void free_array(safe_array* safe_array)
{
free(safe_array->safe_array);
free(safe_array);
}
int* access_array_element(safe_array* safe_array, size_t index)
{
int out_of_range = 0;
if (index >= safe_array->size)
{
return 0;
}
return &safe_array->safe_array[index];
}
int main()
{
/*Create a safe_array and print its elements*/
safe_array my_safe;
init_array(&my_safe, 5, 2);
for (size_t i = 0; i < my_safe.size; i++)
{
printf("Element %d is %d", i, *access_array_element(&my_safe, i));
}
/*Free the safe_array*/
free_array(&my_safe);
return 0;
}
Проблема возникает, когда я пытаюсь сделать free(safe_array)
, но я не понимаю, что именно происходит. Я не могу освободить его, потому что я никогда не выделял ему память, если это так, как я могу полностью освободить эту структуру?
Точное сообщение, которое я получаю, это Debug Assertion Failed
со ссылкой на файл debug_heap.cpp
.
Мне нужно уточнить, что я хочу иметь возможность освободить всю структуру не только от ее содержимого.
Вы тщательно перепутали код, используя одно и то же имя дважды, начиная с 'typedef struct safe_array safe_array;'. Взгляните на функцию 'free_array', где каждый идентификатор является' safe_array'. Насколько безопасным может быть такое обфускация? –
Правда, мой плохой, у меня не было много творчества на этом ... Тем не менее, у вас есть идея? –
Uh .. 'unsafe_array'? Извините, если это кажется жестоким, но если вы не поняли, как использовать выделение памяти в C, вам не удастся написать более безопасную реализацию. –