可能重复:
删除前在C++中测试void指针
代码段1是否等效于代码段2?
//Snippet 1:
delete record;
record = new Record;
//Snippet 2
if (record != NULL)
{
delete record;
record = NULL;
}
record = new Record;
Run Code Online (Sandbox Code Playgroud)
我能看到的唯一区别是,如果Record
构造函数抛出异常,第一个示例可能会将record
变量设置为旧的已删除值,而在第二个示例中,它将设置为NULL
.
编辑:
事实上,第一个样本,如果稍后重复,将导致双重删除.
delete record;
record = new Record; // Throwing exception
// record points to old object
// ... later ...
delete record; // Double deletion - sky falls down etc.
Run Code Online (Sandbox Code Playgroud)
安全的形式是:
delete record; record = 0;
record = new Record; // Can throw an exception if it likes
Run Code Online (Sandbox Code Playgroud)
或者使用std::auto_ptr
而不是原始指针.
这取决于记录的范围.如果它是一个类成员并在析构函数中被删除,那么它们就不一样了.第一个版本可能会留下双删除问题(如果新的Record()抛出),因为记录不是NULL.
如果它有功能级范围,那么我认为第二个版本是矫枉过正.
第二个版本更安全.
归档时间: |
|
查看次数: |
604 次 |
最近记录: |