【问题标题】:C++: Checking for NULL on delete [duplicate]C ++:在删除时检查NULL [重复]
【发布时间】:2011-01-26 11:54:10
【问题描述】:

可能重复:
Test for void pointer in C++ before deleting

代码 sn-p 1 是否等同于 sn-p 2?

//Snippet 1:
    delete record;          
    record = new Record;


//Snippet 2     
    if (record != NULL) 
    {
        delete record;
        record = NULL;
    }       
    record = new Record;

【问题讨论】:

标签: c++


【解决方案1】:

我能看到的唯一区别是,如果Record 构造函数抛出异常,第一个示例可能会将record 变量设置为旧的已删除值,而在第二个示例中,它将设置为@987654323 @。

编辑:
实际上,如果稍后重复第一个样本,则会导致双重删除。

delete record;
record = new Record; // Throwing exception
// record points to old object
// ... later ...
delete record; // Double deletion - sky falls down etc.

安全的形式是:

delete record; record = 0;
record = new Record; // Can throw an exception if it likes

或者使用std::auto_ptr 代替原始指针。

【讨论】:

  • ...正如詹姆斯指出的那样,这可能会导致双重删除问题(只是为了完整性而添加)。
【解决方案2】:

这取决于记录的范围。如果它是类成员并且在析构函数中被删除,那么不,它们不一样。第一个版本可能会给您带来双重删除问题(如果 new Record() 抛出),因为记录不为 NULL。

如果它具有函数级范围,那么我认为第二个版本是矫枉过正。

第二个版本更安全。

【讨论】:

  • 好收获。您可能想提一下,这是在 Record 构造函数抛出的情况下,它是关于将 0 分配给指针,而不是在删除之前检查 null。
  • +1 用于发现提问者和所有密切投票者错过的内容:标题不反映问题的主体。
【解决方案3】:

它们的相同之处在于每个末尾都有一个新记录,但 sn-p 2 在删除之前对 NULL 进行了不必要的检查。

【讨论】:

    【解决方案4】:

    C++ 中的delete 操作符需要在指针为NULL 时才能正常工作(什么也不做),所以两个代码片段是一样的。例如,请参阅http://opensource.devx.com/tips/Tip/14443

    【讨论】:

      【解决方案5】:

      是的,它是:NULL 指针上的delete 预计将与您后面的代码一样工作。

      见$ 5.3.5:

      2 如果操作数具有类类型,则 操作数转换为指针类型 通过调用上述 转换函数和转换后的 操作数用于代替 剩余部分的原始操作数 本节。在任一种选择中, delete 操作数的值可能 是一个空指针值。

      【讨论】:

        【解决方案6】:

        一个挑剔的答案:结果是相同的 IF 记录是一个指向记录的指针(其他帖子中描述的警告是记录构造函数抛出)。如果是隐式转换为指针的类类型,结果可能不一样(因为运算符可能被重载。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-10
          • 2011-04-18
          • 1970-01-01
          • 2017-04-21
          • 2012-07-03
          • 2021-01-11
          • 1970-01-01
          • 2013-05-08
          相关资源
          最近更新 更多