异常安全的核心目标是确保异常发生时程序状态有效:不泄漏资源、不损坏数据、不破坏不变量;C++提供基本、强和不抛异常三类保证,需依托RAII、Copy-and-Swap及noexcept移动/析构实现。
异常安全不是“不抛异常”,而是确保程序在异常发生时仍保持有效状态:对象不泄漏、数据不损坏、不变量不被破坏。C++中主要关注三类保证:基本异常安全(资源不泄漏,对象处于可析构状态)、强异常安全(操作要么完全成功,要么回滚到调用前状态)、不抛异常安全(noexcept,关键路径如析构函数、移动操作必须满足)。
II:资源管理的基石所有资源(内存、文件、锁、socket等)必须封装在栈对象中,由构造函数获取、析构函数释放。避免裸指针和手动delete/new。
赋值运算符、容器插入等易出错操作,应先完成所有可能抛异常的操作(如内存分配、拷贝),再原子切换状态。
T& operator=(T other) { swap(*this, other); return *this; }(注意参数传值,触发拷贝)析构函数若抛异常,可能导致std::terminate;移动构造/赋值若未声明noexcept,容器(如std::vector扩容)将退化为拷贝而非移动。
T(T&&) noexcept { ... }