c++ - 异常安全和 make_unique

标签 c++ c++11 unique-ptr exception-safety

澄清一下,使用 make_unique 仅在表达式中有多个分配时才增加异常安全性,而不仅仅是一个,对吗?例如

void f(T*);

f(new T);

是完全异常安全的(就分配和东西而言),而

void f(T*, T*);

f(new T, new T);

不是,对吗?

最佳答案

不仅当你有多个分配时,而且当你可以在不同的地方 throw 时。考虑一下:

f(make_unique<T>(), function_that_can_throw());

对比:

f(unique_ptr<T>(new T), function_that_can_throw());

第二种情况,允许编译器调用(按顺序):

  • new T
  • function_that_can_throw()
  • unique_ptr<T>(...)

显然如果 function_that_can_throw实际上抛出然后你泄漏。 make_unique防止这种情况发生。

当然,第二次分配(如您的问题)只是 function_that_can_throw() 的特例。 .

作为一般经验法则,只需使用 make_unique使您的代码保持一致。当您需要 unique_ptr 时,它总是正确的(阅读:异常安全) ,并且它对性能没有任何影响,因此没有理由不使用它(实际上使用它会引入很多陷阱)。

关于c++ - 异常安全和 make_unique,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19472550/

相关文章:

c++ - 元函数对缺失特征的默认行为以及如何检测随机访问

c++ - Variadic 模板基类调用转移

c++ - 唯一_Ptr : Attemting To Reference A Deleted Function

c++ - C++11 中的 unique_ptr vector

c++ - dlclose() 不适用于工厂函数和函数中的复杂静态?

c++ - 我可以编写一个需要函数模板的 C++ 概念吗?必须向该函数模板提供一些枚举值作为模板参数?

c++ - 有没有办法让类成员对象的模板调用不同的构造函数?

c++ - std::unique_ptr 自定义删除器

c++循环在每次迭代时变慢

c++ - 如何理解 Effective C++ 中的 "implementations of virtual constructors"