删除空指针

6

3
记住的重要要点是,在删除后将其设置为NULL。 - vrrathod
1
据我理解,你的理解是正确的,但并不是所有人都持有这种看法。让我们看看编程语言专家们怎么说。 - user395760
2
在C++中,删除空指针是绝对安全的,但并不是所有人都知道这一点。这在C社区尤为明显,因为语言保证free(NULL)没有任何效果,但人们不喜欢阅读标准,并且直觉上认为释放NULL可能会损害系统。因此,在C世界中有更多的if(p) free(p);的例子 :) - Dan Kruchinin
@DanKruchinin,这听起来非常违反直觉,我个人从未去查看标准!但既然我们讨论到了这个话题,那么Linux内核中的kfreevfree也能说出同样的话吗? - Shahbaz
4个回答

9
< p > delete 会为您检查指针是否为NULL,因此您是正确的,不需要进行检查。 < p > 您可能还会看到一些人在删除后将指针设置为NULL,以防止您做任何愚蠢的事情,如尝试使用不再属于您的内存或停止您两次删除指针,这将导致错误。

针对您的评论“这样你就不会做傻事,比如尝试使用不再属于你的内存”,即使是取消引用空指针也是未定义行为。在指针被再次删除时(您已经提到的双重删除),这是有帮助的。 - infinite loop

1

虽然现在是安全的,但过去并非如此 :-) 所以这可能是习惯性的。此外,还有其他删除的后果。1)如果您正在使用专用内存管理器并覆盖 new 和 delete 运算符,则很可能需要进行检查Operator Delete以获取更多详细信息。


6
“[citation needed]”需要引用出处。这是一件很容易添加的事情,而且我记得自始至今 C 语言都保证了 free 正确地处理 NULL(至少从 C89 开始,如果在 ANSI C 中也有的话就更不用说了)。因此,我很难相信曾经存在过一个可用的 C++ 实现无法处理 delete NULL; 的情况。 - user395760

1

这个检查是不必要的。

文档指出,删除将“释放由ptr指向的内存块(如果非空)”。


0

大多数人这样做是因为他们通常有错误处理程序(除此之外,我真的看不出来进行检查的意义)。在某些情况下,他们这样做是为了检查他们是否释放了某些东西,并且没有意外更改指针并通过未释放它而导致内存泄漏。

free(NULL);应该适用于所有情况,而且不会出错,所以除非涉及错误处理,否则可以删除if语句并直接执行free操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接