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

时间:2010-07-29 18:23:54

标签: c memory null free

  

可能重复:
  Setting variable to NULL after free …

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

例如:

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

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

为什么这是一个好习惯?

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

谢谢,Boda Cydo。

4 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

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

答案 3 :(得分:-5)

我想是的......

当你使用了一部分menory时,我们应该释放()它。这允许释放的内存用于其他目的......就像进一步的malloc()调用一样。

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

希望这有助于......:)