【发布时间】:2011-03-22 21:37:25
【问题描述】:
我正在学习良好的 C 编程实践,我的朋友告诉我在释放指针(或调用特定的释放函数)后总是将指针设置为 NULL。
例如:
char* ptr = malloc(100);
...
free(ptr);
ptr = NULL;
或
struct graph* graph = create_graph();
...
destroy_graph(graph);
graph = NULL;
为什么这是一个好的做法?
更新:阅读答案后,这对我来说似乎是一种糟糕的做法!我隐藏了可能的 double-free() 错误。这怎么可能是一个好习惯?我很震惊。
谢谢,博达·赛多。
【问题讨论】:
-
@bodacydo 看看页面右侧的“相关”问题。
-
怎么样?释放指针并将其设置为 NULL 可以释放内存。如果你决定释放 NULL,你应该得到一个断言或其他警告。双重释放内存比释放 NULL 更难跟踪。
-
如果你释放 NULL 它默默地什么都不做,你不会得到断言。这是一件好事,因为它使清理代码更容易,您需要更少的 if;但我至少可以从“隐藏错误”的角度看到 OP 的来源。
-
@bodacydo:它隐藏了双重释放,但不这样做可能会隐藏野指针错误(在内存被释放后访问指针)。这是一个权衡,所以它不一定是坏的(但不一定是好的)。就我个人而言,我不认为多余的空指针一定是错误,但访问野指针总是是错误的,所以我支持分配给
NULL。 -
我相信逻辑是双释放是一个较小的错误,它实际上使用了已释放的内存。假设您在一台机器上,其中取消引用 NULL 会引发一个信号,您很快就会发现一个严重的错误。