[英]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.