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保持不变还是会改变?说明.
这段代码
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)
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |