我在C中有一个结构如下:
typedef struct ArrayStruct{
float * array;
size_t used;
size_t size;
}Array;
我按如下方式初始化它:
void initArray(Array *a, size_t initialSize) {
a->array = (float *)malloc(initialSize * sizeof(float));
if(a->array){
}
else{
printf("OUT OF MEMORY 1!!\n\r");
}
a->used = 0;
a->size = initialSize;
}
我的问题是:以下代码是释放结构使用的任何内存的正确方法:
void freeArray(Array *a) {
a->array = NULL;
free(a->array);
a->used = 0;
a->size = 0;
}
请帮忙。谢谢。 :)
答案 0 :(得分:3)
不,这不是执行free
的正确方法,因为您在实际释放之前将指针设置为NULL
。你应该反过来做这件事:
free(a->array); // Free the memory
a->array = NULL; // Clear out a dangling pointer
具有空条件分支的模式也是有问题的。而不是做
if(a->array){
}
else{
printf("OUT OF MEMORY !!!\n\r");
}
你应该做
if(!a->array){
printf("OUT OF MEMORY !!!\n\r");
}
当分配失败时,您还应该将a->size
设置为零(目前您的代码即使在分配失败时也会将大小设置为initialSize
):
if(!a->array){
printf("OUT OF MEMORY !!!\n\r");
a->used = 0;
a->size = 0;
return;
}
答案 1 :(得分:2)
freeArray
使用了错误的订单。首先将a->array
设置为NULL
,然后尝试free
NULL
指针。这不起作用。您需要交换函数中的前两行:first free
,然后将指针设置为NULL
。
void freeArray(Array *a) {
free(a->array);
a->array = NULL;
a->used = 0;
a->size = 0;
}
答案 2 :(得分:2)
执行此操作时:
void freeArray(Array *a) {
a->array = NULL;
free(a->array);
a->used = 0;
a->size = 0;
}
您首先为指针指定NULL,让我们看看当您使用NULL指针调用free时发生的情况documentation:
void free(void * ptr);释放先前分配的空间 malloc(),calloc(),aligned_alloc,(自C11)或realloc()。如果是ptr 一个空指针,该函数什么都不做。
所以什么都没发生,你没有解除任何东西,你正在创建一个内存泄漏,因为你没有对内存的引用了。
要使其正常工作,您只需更改顺序并在
之后设置NULLvoid freeArray(Array *a) {
free(a->array);
a->array = NULL;
a->used = 0;
a->size = 0;
}