标准::unique_ptr和异常安全
std::unique_ptr and exception safety
我是否需要用try/catch
将std::unique_ptr
用法包装在代码中,这应该是异常安全的?
std::unique_ptr
将保存由::malloc
创建的原始内存块(使用我的自定义删除器调用::free
)。
std::unique_ptr
的所有构造函数*都是noexcept
-
malloc
不会在失败时引发任何异常...它只会返回nullptr
. - 我相信你的删除器的构造函数也不会抛出任何东西。
所以你不需要抓住任何东西,因为什么都不会被扔掉。
*: 参见 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
类型的构造函数可以抛出。
相关文章:
- C++代码中的异常安全
- 编写"anti-lack of memory"异常安全代码
- std:string::substr 异常安全吗?
- 如何以异常安全的方式使用放置新?
- 异常安全服务器
- 实现 std::vector::p ush_back 强异常安全
- 标准::unique_ptr和异常安全
- 如何使用QThreads使无锁生产者-消费者线程交换更加异常安全
- 使功能异常安全
- 与构造函数参数相关的异常安全的习语
- uninitialized_copy() 异常安全吗?
- 为什么我们需要 RAII 来解决异常安全问题
- 异常安全构造函数
- 关于 swap() 操作的异常安全 - 这有什么问题?
- std::vector::擦除异常安全
- 异常安全 - 用于可靠回滚对象状态的模式
- 异常安全的 for 循环
- 异常安全代码和移动语义
- 向量::插入的异常安全保证是什么?
- 异常安全和make_unique