我正在尝试在C中实现“我的”安全数组版本,当我尝试释放我创建的结构时,我遇到了内存泄漏问题,我无法弄清楚问题。
#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
文件的链接。
我需要确切地说,我希望能够释放整个结构而不仅仅是其内容。
答案 0 :(得分:2)
问题是&my_safe
是指向堆栈上分配的结构的指针(通过将其声明为局部变量),而不是堆上分配的 (使用malloc
)。因此,您无法在其上调用free
。
由于init_array
要求客户端代码已经分配了结构,free_array
同样需要客户端代码来处理以后解除分配结构。正如init_array
仅为数组内容分配内存一样,free_array
应该只为内存释放内存:
void free_array(safe_array* safe_array)
{
free(safe_array->safe_array);
}
答案 1 :(得分:2)
这是正确的。您可以free
使用malloc
分配的内容(或间接分配给strdup
)。您不能free
未使用malloc
分配的内容,而my_safe
不是使用malloc
分配的内容。