在free()之后将指针设置为NULL总是一个好习惯吗?

bod*_*ydo 8 c memory free null

可能重复:
释放后将变量设置为NULL ...

我正在学习优秀的C编程实践,我的朋友告诉我在free()之后总是将指针设置为NULL(或调用特定的释放函数).

例如:

char* ptr = malloc(100);
...
free(ptr);
ptr = NULL;
Run Code Online (Sandbox Code Playgroud)

要么

struct graph* graph = create_graph();
...
destroy_graph(graph);
graph = NULL;
Run Code Online (Sandbox Code Playgroud)

为什么这是一个好习惯?

更新:看完答案后,对我来说这似乎是一个糟糕的做法!我隐藏了可能的double-free()错误.这怎么可能是一个好的做法?我很震惊.

谢谢,Boda Cydo.

R S*_*hko 14

虽然它不会伤害,但它并不总是有帮助.要考虑的问题是,指针的多个副本很容易,而且很可能只会将单个副本设置为NULL.它根本没有帮助的经典例子是:

void free_graph(graph *g)
{
    ...
    free(g);
    g = NULL;  // not useful in this context
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是你只是将本地指针设置free_graph为NULL并且调用者保持指针free_graph仍然具有它的原始值.


Dar*_*ron 6

这被一些人认为是一种很好的做法,因为它可以防止你在free()ed之后意外访问内存.


Han*_*ant 2

我的糟糕做法投票。如果您确实想分配一个值,请将其设置为 (void*)0xdeadbeef。首先检查一下你的 CRT 能做什么。一个好的调试分配器会将释放的内存设置为一种模式,当指针被释放后使用时,这种模式可能会导致炸弹。尽管这并不能保证。但改变指针值是更好(更快)的解决方案。