CodeWalk

C++异常安全与noexcept关键字

作者:我是大山 · 2026-05-30 12:55

请解释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。