我是否需要将std::unique_ptr
用try/catch
包含在应该是例外安全的代码中?
std::unique_ptr
将保留由::malloc
创建的原始内存块(我的自定义删除器可以调用::free
)。
答案 0 :(得分:6)
std::unique_ptr
的{{3}} *都是noexcept
malloc
不会在失败时抛出任何异常......它只会返回nullptr
。所以你不需要捕捉任何东西,因为什么都不会被抛出。
*:参见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
的构造函数可以抛出