std :: unique_ptr和异常安全

den*_*nys 1 c++ stl c++11

我是否需要在代码中包含std::unique_ptr使用,try/catch这应该是异常安全的?
std::unique_ptr将保存由::malloc(使用我的自定义删除器调用::free)创建的原始内存块.

sky*_*ack 7

如评论中所述,此答案仅与 C++14 相关

尽管@keenyt了很好的答案,这是值得说,std::make_unique<T>可以抛出,即使的构造函数std::unique_ptrnoexcept
实际上,上述语句是否抛出主要取决于所T涉及类型的构造函数。

如从示例cppreference.comstd::make_unique

可能抛出 std::bad_alloc 或任何由 T 的构造函数抛出的异常。如果抛出异常,则此函数无效。

因此,答案的改进是:不,您不需要try/catch块,除非您正在使用std::make_unique并且您类型的构造函数T可以抛出。


ken*_*ytm 6

  1. 所有std::unique_ptr构造函数都是noexcept
  2. malloc不会在失败时抛出任何异常......它只会返回nullptr.
  3. 我相信你的删除者的构造函数也不会抛出任何东西.

所以你不需要捕捉任何东西,因为什么都不会被抛出.


*:参见C++11§20.7.1.2.1 unique_ptr构造函数[unique.ptr.single.ctor]