c++ - 如果赋值过程中发生异常,指针的值会改变吗?

标签 c++ exception

考虑以下代码,其中 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/

相关文章:

c++ - 缓存的不可变值 : avoid lock

delphi - 禁用异常处理并让windows捕获它?

C++ 使用结构返回多个值

c++ - 如何安全、明智地确定指针是否指向指定缓冲区的某个位置?

c++ - 如何在 Leptonica 中围绕图像 (PIX) 中的矩形创建边框?

sql - 如何在函数中抛出异常

c++ - CMAKE Compile_Flag

C++:字段的类型不完整

C++ 处理未捕获的异常

java - 谷歌应用引擎 HardDeadlineExceededError