删除空指针[重复]
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内核中的kfree
和vfree
是否可以这样说?
【参考方案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 语句并执行免费操作。
【讨论】:
以上是关于删除空指针[重复]的主要内容,如果未能解决你的问题,请参考以下文章