我正在尝试实现一个如下所示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
。