c++赋值操作符异常安全
c++ assignment operator exception safety
非常直接的问题:
要求赋值操作符不能抛出异常的原因是什么?
同时,构造函数可以抛出?
如果你必须不抛出异常,如何处理众所周知的"自定义"字符串的例子,如果没有足够的内存缓冲区分配?
如果你只是分配更少或保持旧状态,但不抛出异常,一切都会"看起来"顺利,但会有严重的(隐藏的)错误。
绝对没有这样的要求。赋值抛出是完全可以的。在许多情况下,抛出是不可避免的(例如,当赋值必须分配一些内存而没有剩余内存时)。
赋值永远不应该使对象处于未定义状态。它必须要么成功地赋一个新值,要么让对象保持其原始状态(或者可能是其他一些不太理想的有效状态)并抛出。这个语义通常由复制-交换习惯用法实现。复制阶段可以扔。这使得受让人完好无损。
相关文章:
- C++代码中的异常安全
- 编写"anti-lack of memory"异常安全代码
- std:string::substr 异常安全吗?
- 如何以异常安全的方式使用放置新?
- 通过引用从 c++ 函数异常返回对象是否安全
- 异常安全服务器
- 实现 std::vector::p ush_back 强异常安全
- 标准::unique_ptr和异常安全
- 如何使用QThreads使无锁生产者-消费者线程交换更加异常安全
- 使功能异常安全
- 与构造函数参数相关的异常安全的习语
- uninitialized_copy() 异常安全吗?
- 为什么我们需要 RAII 来解决异常安全问题
- 异常安全构造函数
- 关于 swap() 操作的异常安全 - 这有什么问题?
- std::vector::擦除异常安全
- 异常安全 - 用于可靠回滚对象状态的模式
- 异常安全的 for 循环
- 异常安全代码和移动语义
- 向量::插入的异常安全保证是什么?