【问题标题】:Check for NULL before delete in C++ - good practice? [duplicate]在 C++ 中删除之前检查 NULL - 好的做法? [复制]
【发布时间】:2012-12-11 10:56:05
【问题描述】:

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

我知道The C++ language guarantees that delete p will do nothing if p is equal to NULL。但在不同的项目、文章、示例中,我经常看到它在删除之前检查 NULL。通常采用格式

    if(pObj)
       delete pObj;

为什么会这样?一些历史原因?我完全不知道如何正确地删除对象。

【问题讨论】:

  • 我认为这往往只是无知。另外,关于如何正确删除对象...使用 RAII。
  • 有些平台不执行标准删除。嵌入颗粒。在一个平台上 delete(NULL) 断言。这是为了优化和认为应用程序不同。但是我看到有些人使用了这种“hack”并且没有考虑对象的生命周期......导致应用程序更大更慢。
  • 尽可能考虑使用智能指针。

标签: c++ delete-operator


【解决方案1】:

为什么会这样?

无知。有些人不知道delete(NULL); 什么都没做。

你不能真正检查指针是否真的有效。如果您删除两次,您将调用未定义的行为。

【讨论】:

  • +1 表示“无知”,就是这样
【解决方案2】:

不,这完全没有意义。 delete 不会删除已经设置为 null 的指针!所以随便删除一个空指针吧!

【讨论】:

  • 什么鬼 - 给 C 一个坏名字。你可以在 C 中安全地freeNULL...
  • 如果我为班级重载delete 而忘记在其中添加安全检查怎么办?
  • 那么您提供了一个损坏的删除运算符实现。这不是运营商用户的错,而是实施者的错。
  • @aleguna 是的,这很有帮助:修复损坏的地方。
  • @aleguna:这个逻辑的问题在于它适用于一切。您的代码是否应该检查x++ 是否将x 加一?如果有人用损坏的代码超载operator++() 怎么办?
【解决方案3】:

delete 是一个运算符,它调用一个析构函数。当 delete 运算符与NULL 一起使用时,什么也没有发生,所以与所有答案一样,检查是否为空是没有意义的。

【讨论】:

    【解决方案4】:

    这样做的另一个原因是摆脱 valgrind 警告。

    【讨论】:

    • 对不起,什么是“valgrind”?
    • valgrind 是一个检查内存损坏的程序。当试图释放一个 NULL 指针时,它会给出一个空闲的非堆警告。
    • @Minion91 这不是表明问题出在其他地方吗?为什么有人会首先删除指针两次。它有点掩盖而不是解决真正的问题。
    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2010-10-07
    • 2010-10-11
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多