8

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

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

例如:

char* ptr = malloc(100);
...
free(ptr);
ptr = NULL;

或者

struct graph* graph = create_graph();
...
destroy_graph(graph);
graph = NULL;

为什么这是一个好习惯?

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

谢谢,博达赛多。

4

4 回答 4

14

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

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

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

于 2010-07-29T18:32:08.370 回答
6

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

于 2010-07-29T18:30:48.047 回答
2

我的不良做法投票。如果您确实要分配一个值,请将其设置为 (void*)0xdeadbeef。不过,请先检查您的 CRT 可以做什么。一个体面的调试分配器会将释放的内存设置为一种模式,当指针在释放后使用时可能会导致炸弹。虽然不能保证。但是改变指针值是更好(更快)的解决方案。

于 2010-07-29T18:49:39.110 回答
-5

我想是的 ...

当您使用完一部分 menory 后,我们应该 free() 它。这允许释放的内存用于其他目的……比如进一步的 malloc() 调用。

Free 将指向内存的指针作为参数并释放指针所指的内存...

希望这可以帮助 ... :)

于 2010-07-29T18:28:37.843 回答