我正在学习优秀的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。
答案 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将指向内存的指针作为参数释放并释放指针所指向的内存...
希望这有助于......:)