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;
我能看到的唯一区别是,如果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
代替原始指针。
......这可能会导致双重删除问题,正如詹姆斯指出的那样(仅仅为了完整性而添加)。 – 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。
如果它具有功能级范围,那么我认为第二个版本是矫枉过正。
第二个版本更安全。
好抓。您可能想要提到的是,这是在Record构造函数抛出的情况下,它是关于将0分配给指针,而不是在删除之前检查null。 – etarion 2011-01-26 12:11:10
重复项(只有第一页的结果,还有更多):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