删除空指针[重复]

Posted

技术标签:

【中文标题】删除空指针[重复]【英文标题】:Deleting a null pointer [duplicate] 【发布时间】:2011-12-21 17:08:52 【问题描述】:

可能重复:Is there any reason to check for a NULL pointer before deleting?

我经常在代码中看到以下内容:

if(pointer)
    delete pointer;

据我了解,删除空指针是安全的,那么这个检查的意义何在?

【问题讨论】:

要记住的重要一点是一旦删除就将其设置为NULL。 据我了解,您的理解是正确的,但并非所有人都认同。但是让我们看看语言专家怎么说。 在 C++ 中删除空指针是绝对安全的,但并不是所有人都知道这一点。在 C 社区中尤其值得注意,其中语言保证 free(NULL) 无效,但人们不喜欢阅读标准,直觉上似乎释放 NULL 会损害系统。因此有更多的例子 if (p) free(p);在 C 世界中:) @DanKruchinin,这听起来很反直觉,我个人从来没有去检查它的标准!但是,当我们这样做时,Linux内核中的kfreevfree是否可以这样说? 【参考方案1】:

delete 将为您检查指针是否为 NULL,因此您是对的,不需要检查。

您可能还会看到有些人将指针设置为 NULL 它被删除后,这样您就不会做任何愚蠢的事情,例如尝试使用不再属于您的内存或阻止您删除指针两次,会报错。

【讨论】:

对于您的评论“这样您就不会做任何愚蠢的事情,例如尝试使用不再属于您的内存”,即使取消引用空指针也是 UB。如果再次删除指针(您已经提到的双重删除),这很有帮助【参考方案2】:

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

【讨论】:

[citation needed]。这是一件很容易添加的事情,IIRC C 保证 free 永远正确处理 NULL (至少 C89,如果它也在 ANSI C 中,我不会感到惊讶)。所以我很难相信曾经有一个可用的 C++ 实现无法处理 delete NULL;【参考方案3】:

检查不是必需的。

The documentation 声明 delete 将“释放 ptr 指向的内存块(如果不为空)”

【讨论】:

【参考方案4】:

大多数人这样做是因为他们通常会在其他方面进行错误处理(除此之外,我并没有真正看到进行检查的意义)。在某些情况下,他们这样做是为了检查他们是否正在释放某些东西,而不是意外地更改某处的指针并通过不释放它而导致内存泄漏。 free(NULL); 应该在所有情况下都有效,并且不会出错,因此除非涉及错误处理,否则您可以删除 if 语句并执行免费操作。

【讨论】:

以上是关于删除空指针[重复]的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer18.删除链表中重复节点

onCreate空指针异常[重复]

可访问空指针[重复]

getApplicationContext给出空指针异常[重复]

操作栏中的空指针异常[重复]

Spring自动装配空指针异常[重复]