这里的代码不是异常安全的
//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。
答案 0 :(得分:1)
第一个代码片段的问题在于,C ++ Standard未定义构建f()参数的两个子表达式。 也就是说,如果它发生如下:
这将完美无缺。 但订单很可能就像:
如果第2步(alloc T2)抛出,已分配的T1内存将无法恢复。
为防止出现这种情况,请在您提供的第二个代码段中进行明确排序。