这是在C中释放内存的正确方法吗?

时间:2016-04-13 19:23:34

标签: c

我在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;
}

请帮忙。谢谢。 :)

3 个答案:

答案 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   一个空指针,该函数什么都不做。

所以什么都没发生,你没有解除任何东西,你正在创建一个内存泄漏,因为你没有对内存的引用了。

要使其正常工作,您只需更改顺序并在

之后设置NULL
void freeArray(Array *a) {
   free(a->array);
   a->array = NULL;    
   a->used = 0;
   a->size = 0;
}