繁体   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