如果在赋值期间发生异常,指针的值是否会改变?

Sak*_*ham 2 c++ exception-handling

考虑以下代码,其中pb是类的成员myclass:

myclass& operator=(const myclass& rhs){
    myclass *pOrig = pb;
    pb = new myclass(*rhs.pb);  //exception occurs here .
    delete pOrig;            
    return *this; 
}
Run Code Online (Sandbox Code Playgroud)

价值会pb保持不变还是会改变?说明.

sha*_*oth 5

这段代码

pb = new myclass(*rhs.pb);
Run Code Online (Sandbox Code Playgroud)

相当于以下内容:

{
    myclass * temp = new myclass(*rhs.pb); //can throw
    pb = temp; //cannot throw
}
Run Code Online (Sandbox Code Playgroud)

因此,如果new语句因任何原因抛出(无法分配或无法构造),pb则不会更改值.

这就是为什么如果ptr在代码的调用之间保持值,则以下代码是危险的:

// BAD
delete ptr;
ptr = new CoolObject();
Run Code Online (Sandbox Code Playgroud)

因为如果ptr非null并且new抛出然后ptr现在保持无效值并再次运行此代码将导致所谓的"双重删除",这会导致未定义的行为.

以下代码避免了这个问题:

// MUCH BETTER
delete ptr;
ptr = 0;
ptr = new CoolObject();
Run Code Online (Sandbox Code Playgroud)