free通过值传递给函数的指针有什么作用?

cur*_*age 4 c pointers memory-management

众所周知,如果我们通过值将指针传递给函数,它就不能在函数内释放,如下所示:

void func(int *p)
{
    free(p);
    p = NULL;
}
Run Code Online (Sandbox Code Playgroud)

p持有(可能是有效的)地址的副本,所以free(p)试图释放它.但由于它是一个副本,它不能真正释放它.对free()的调用如何知道它不能真正释放它?

上面的代码不会产生错误.这是否意味着free()只是默默地失败,"某种程度上"知道作为参数传入的地址无法处理?

小智 18

p持有(可能是有效的)地址的副本,所以free(p)试图释放它.但由于它是一个副本,它不能真正释放它.

这不是真的.free()如果pmalloc()(或NULL)返回的有效地址,可以正常工作.

实际上,这是实现自定义"析构函数"函数的常见模式(在C中编写OO样式代码时).

您可能意味着在此之后p不会改变NULL- 但这很自然,因为您按价值传递它.如果你想free() null指针,然后通过指针("byref")传递它:

void func(int **p)
{
    if (p != NULL) {
        free(*p);
        *p = NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它

int *p = someConstructor();
func(&p);
// here 'p' will actually be NULL
Run Code Online (Sandbox Code Playgroud)