考虑以下代码,其中 pb
是类 myclass
的成员:
myclass& operator=(const myclass& rhs){
myclass *pOrig = pb;
pb = new myclass(*rhs.pb); //exception occurs here .
delete pOrig;
return *this;
}
pb
的值会保持不变还是会改变?解释一下。
最佳答案
这段代码
pb = new myclass(*rhs.pb);
相当于以下内容:
{
myclass * temp = new myclass(*rhs.pb); //can throw
pb = temp; //cannot throw
}
因此,如果 new
语句因任何原因抛出(无法分配或无法构造),pb
值不会更改。
这就是为什么如果 ptr
在代码调用之间保留该值,则以下代码是危险的:
// BAD
delete ptr;
ptr = new CoolObject();
因为如果 ptr
不为 null 并且 new
抛出,那么 ptr
现在持有一个无效值,再次运行此代码将导致如此-称为“双重删除”,这会导致未定义的行为。
以下代码可以避免该问题:
// MUCH BETTER
delete ptr;
ptr = 0;
ptr = new CoolObject();
关于c++ - 如果赋值过程中发生异常,指针的值会改变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29230572/