为什么使用auto_ptr的异常安全代码不同?

时间:2014-03-24 07:57:50

标签: c++ exception

这里的代码不是异常安全的

//Header file declaration
void f(auto_ptr<T1>, auto_ptr<T2>);

//Implementation file:
f(auto_ptr<T1>(new T1), auto_ptr<T2>(new T2));

上述异常安全解决方案建议如下:

//Implementation file:
{
    auto_ptr<T1> t1(new T1);
    auto_ptr<T2> t2(new T2);
    f(t1, t2);
}

我的问题是,当两者都使用auto_ptr来处理资源分配时它会有什么不同?

此问题解决方案是&#34;更多例外C ++&#34;作者:Herb Sutter。

1 个答案:

答案 0 :(得分:1)

第一个代码片段的问题在于,C ++ Standard未定义构建f()参数的两个子表达式。 也就是说,如果它发生如下:

  • 分配&amp;构建T1
  • auto_ptr取得T1的所有权
  • 分配&amp;构建T2
  • auto_ptr取得T2的所有权

这将完美无缺。 但订单很可能就像:

  • 分配&amp;构建T1
  • 分配&amp;构建T2
  • auto_ptr取得T1的所有权
  • auto_ptr取得T2的所有权

如果第2步(alloc T2)抛出,已分配的T1内存将无法恢复。

为防止出现这种情况,请在您提供的第二个代码段中进行明确排序。