[英]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->array
為NULL
,然后嘗試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.