std :: unique_ptr和异常安全

时间:2016-05-31 08:29:05

标签: c++ c++11 stl

我是否需要将std::unique_ptrtry/catch包含在应该是例外安全的代码中? std::unique_ptr将保留由::malloc创建的原始内存块(我的自定义删除器可以调用::free)。

2 个答案:

答案 0 :(得分:6)

  1. 所有std::unique_ptr的{​​{3}} *都是noexcept
  2. malloc不会在失败时抛出任何异常......它只会返回nullptr
  3. 我相信你的删除者的构造函数也不会抛出任何东西。
  4. 所以你不需要捕捉任何东西,因为什么都不会被抛出。

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

答案 1 :(得分:3)

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

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

std::make_unique try/catch的示例:

  

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

因此,答案的改进将是:不,您不需要std::make_unique块,除非您使用T并且类型/^\s*x的构造函数可以抛出