C - 自由 malloc 指针位置问题



我正在尝试实现一个如下所示set_it_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内部对本地副本的任何赋值都将仅是本地的。这意味着函数内部NULL赋值仅对局部pointer变量完成,一旦函数返回,指针a仍将指向现在未分配的内存。

对于最后一个问题,有四种方法可以解决这个问题:第一种是通过引用传递指针(如 abelenky 的答案),另一种是返回新指针(类似于 realloc 所做的)。第三种方法是在函数调用后分配给a,要么NULL,要么让它指向其他东西。第四种方法是不再使用变量a

最新更新