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()
如果p
是malloc()
(或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)