C++:检查NULL上删除

问题描述:

可能重复:
Test for void pointer in C++ before deletingC++:检查NULL上删除

是代码段1相当于代码段2?

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


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

重复项(只有第一页的结果,还有更多):http:// *。com/questions/615355/is-there-any-reason-to-check-for-a-null-pointer-before-deletion http://*.com/questions/4190703/is-it-safe-to-delete -a-null-pointer http://*.com/questions/3821261/null-check-before-deleting-an-object http://*.com/questions/724688/how-many-of-you-are - 意识到,它的安全 - 删除空指针http://*.com/questions/1558013/delete-null-but-no-compile-error http://*.com/questions/3844374/test-for-void-pointer-in-c-before-deletion – 2011-01-26 12:02:57

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

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

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代替原始指针。

+0

......这可能会导致双重删除问题,正如詹姆斯指出的那样(仅仅为了完整性而添加)。 – etarion 2011-01-26 12:12:50

他们是在同你必须在每月底的新纪录,但片断二包含对NULL删除之前,不必要的检查。

在C++中的delete运算符需要在指针为NULL时正常工作(什么也不做),因此这两个代码片段是相同的。例如,请参阅http://opensource.devx.com/tips/Tip/14443

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

参见$ 5.3.5:

2如果操作数具有类类型,操作数 通过调用上述 转换函数转换为指针类型 ,并且将转换后的操作数 用于代替 本部分的其余部分的 原始操作数。在任一替代方案中, 删除操作数的值可能为 为空指针值。

一个挑剔的答案:结果是一样的IF记录是一个指向记录的指针(在其他文章中描述的警告和记录构造函数抛出)。如果是隐式转换为指针的类类型,结果可能会不一样(因为操作符可能会超载)。

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

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

第二个版本更安全。

+0

好抓。您可能想要提到的是,这是在Record构造函数抛出的情况下,它是关于将0分配给指针,而不是在删除之前检查null。 – etarion 2011-01-26 12:11:10