C++:在删除时检查NULL

bli*_*egz 4 c++

可能重复:
删除前在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)

Dou*_*der 8

我能看到的唯一区别是,如果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而不是原始指针.


Jam*_*mes 6

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

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

第二个版本更安全.