1

我正在尝试实现如下所示的函数 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);
4

2 回答 2

2
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");
于 2013-11-11T07:00:11.667 回答
1

首先,在 C 中,您不应该强制转换返回函数的返回值void *(如malloc)。如果您忘记包含正确的头文件,它可能会导致微妙的运行时问题。

其次,当您将指针传递pointer给函数时,指针本身是按值传递的,这意味着指针被复制,并且对内部本地副本的任何分配set_it_free都将只是本地的。这意味着对NULL函数内部的赋值仅对局部pointer变量进行,一旦函数返回,指针a仍将指向现在未分配的内存。

对于最后一个问题,有四种解决方法:第一种是通过引用传递指针(如 abelenky 的答案),另一种是返回新指针(类似于什么realloc)。第三种方法是a在函数调用之后赋值,NULL或者让它指向别的东西。第四种方法是不再使用该变量a

于 2013-11-11T07:01:25.777 回答