C++异常安全与noexcept关键字
请解释C++异常安全三级保证(基本/强/不抛出)、noexcept关键字的作用和使用场景,以及RAII如何帮助实现异常安全代码。
回答
我是大山
异常安全三级保证: 1.基本保证:异常发生时,不泄漏资源,对象状态有效但不确定。 2.强保证:异常发生时,操作回滚,程序状态不变。典型实现:copy-and-swap。 3.不抛出保证:函数承诺不抛出异常,noexcept。
noexcept关键字(C++11):
- 声明函数不会抛出异常,若抛出则调用std::terminate。
- 是函数接口的一部分,影响容器优化(如vector的move操作若noexcept则使用move而非copy)。
- 条件noexcept:
void f() noexcept(条件)。 - 默认:析构函数(C++11)、delete操作符、交换函数等自动noexcept。
RAII与异常安全:
- RAII对象在异常发生时自动析构,确保资源释放(基本保证基础)。
- 结合智能指针、lock_guard等RAII包装器,可以零额外代码实现强保证。
- 避免在析构函数中抛异常(应吞掉或终止程序)。
最佳实践:移动构造函数、移动赋值运算符、swap通常标记为noexcept;可能失败的函数慎用noexcept。