std::string赋值运算符遇length_error/bad_alloc时是否保留原字符串?
std::string赋值运算符的异常安全保证与冗余代码分析
核心结论
当std::string的赋值运算符因length_error或bad_alloc异常失败时,原字符串的完整性会完全保留,不会产生任何修改。从C++11开始,std::string的operator=就满足强异常保证——只要操作抛出异常,对象会回到执行赋值前的初始状态,没有任何副作用。
你的BigInt赋值运算符代码冗余性分析
你之前为了异常安全,手动用临时字符串保存原num值、试图在赋值失败时恢复的代码是完全多余的。因为std::string自身已经内置了这种异常安全保障,手动备份恢复的逻辑属于重复劳动,不会给代码的异常安全性带来任何额外提升。
标准实现原理参考
std::string的强异常保证通常基于RAII(资源获取即初始化)模型实现:
- 先在独立的临时内存空间完成新字符串的构造与内存分配
- 确认新值构造成功后,再通过
noexcept的交换操作,将临时对象的资源与原字符串的资源进行交换 - 如果在构造新值的过程中抛出异常,临时空间的资源会被自动清理,原字符串的状态完全不受影响
内容的提问来源于stack exchange,提问作者FredFrugal
相关产品推荐
相关产品推荐

