簡體   English   中英

這是釋放C語言中的內存的正確方法嗎?

[英]Is this the right way to free memory in 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;
}

我的問題是:以下代碼是釋放struct占用的任何內存的正確方法:

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

請幫忙。 謝謝。 :)

不,這不是執行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設置為零(當前代碼會遇到即使分配失敗也將size設置為initialSize的情況):

if(!a->array){
    printf("OUT OF MEMORY !!!\n\r");
    a->used = 0;
    a->size = 0;
    return;
}

freeArray使用了錯誤的順序。 它首先將a->arrayNULL ,然后嘗試free NULL指針。 這行不通。 您需要交換函數中的前兩行:首先free ,然后將指針設置為NULL

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

執行此操作時:

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

你是第一個指針賦值NULL,讓我們來看看,當你調用免費使用NULL指針找一些發生了什么文件

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM