标准::unique_ptr和异常安全

std::unique_ptr and exception safety

本文关键字:异常 安全 unique 标准 ptr      更新时间:2023-10-16

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

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

所以你不需要抓住任何东西,因为什么都不会被扔掉。


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

如评论中所述,此答案仅适用于C++14

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

作为std::make_unique cppreference.com 的示例:

可能会抛出 std::bad_alloc 或 T 的构造函数抛出的任何异常。如果引发异常,则此函数不起作用。

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