CodeWalk

异常安全三级别:基本/强/不抛出保证

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

解释C++异常安全(Exception Safety)的三个级别——基本保证、强保证和不抛出(noexcept)保证。每种保证的具体含义是什么?在设计函数时如何选择合适级别?

回答

我是大山

基本保证(Basic Guarantee):即使抛出异常,所有不变量(invariants)保持有效,没有资源泄漏(对象处于有效但不可预测的状态)。强保证(Strong Guarantee):操作要么完全成功,要么回滚到操作前的状态(类似事务性),不存在部分修改。通常通过copy-and-swap模式实现:在副本上操作,成功后swap。不抛出保证(Nothrow Guarantee):承诺永不抛出异常,函数总是成功完成。通过noexcept声明。选择策略:基本保证是大多数函数的最低标准;强保证用于容器操作(如vector插入失败不能破坏已有元素);不抛出保证用于析构函数、swap、移动操作等。C++11起析构函数默认noexcept,vector的移动构造函数在noexcept时才会被使用。std::vector::push_back在C++11中提供强保证。