簡體   English   中英

免費malloc指針局部性問題

[英]free malloc pointer locality issue

我正在嘗試實現一個函數set_it_free,如下所示,但它只會在本地使用指針,這不符合我的要求,即free,並為指針設置為null。 你能幫我修改一下set_it_free嗎?

int set_it_free(void* pointer, unsigned long level, char* message){
logMessage(level, message);
assert  (pointer != NULL);  //Never free a NULL pointer
free    (pointer);          //Free a malloc/calloc/realloc pointer
pointer = NULL;             //Set it to NULL for prevention
return 0;}

我會在main()中這樣稱呼它

int* a = (int* )malloc(sizeof(int));
set_it_free(a);
int set_it_free(void** ppointer, unsigned long level, char* message)
{
    logMessage(level, message);
    assert  ( ppointer != NULL);  //Check valid parameter
    assert  (*ppointer != NULL);  //Never free a NULL pointer
    free    (*ppointer);          //Free a malloc/calloc/realloc pointer
    *ppointer = NULL;             //Set it to NULL for prevention
    return 0;
}

示例用法:

sometype* pMyVar = malloc(somesize);
set_it_free(&pMyVar, 5, "freeing myVar");

首先,在C中,您不應該轉換返回void *的函數的返回值(如malloc )。 如果您忘記包含正確的頭文件,它可能會導致細微的運行時問題。

其次,當您將指針pointer傳遞給函數時,指針本身set_it_free值傳遞,這意味着指針被復制,並且對set_it_free的本地副本的任何賦值都只是本地的。 這意味着函數內部對NULL的賦值僅對本地pointer變量進行,一旦函數返回,指針a仍將指向現在未分配的內存。

對於最后一個問題,有四種解決方法:第一種是通過引用傳遞指針(如abelenky的答案),另一種是返回新指針(類似於realloc所做的)。 第三種方式是分配給a函數調用后,無論是NULL或使其指向別的東西。 第四種方法是不再使用變量a

暫無
暫無

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

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