复制交换习语的有效性

时间:2016-05-30 01:28:09

标签: c++ exception

据说C ++数据容器中from smsapp import models的复制交换模式的固有价值来自

  1. 代码重用和
  2. 例外安全。
  3. 然而,复制交换习惯分配的内存比其他方式要多得多,因为在创建副本之前不会销毁数据,从而大大增加了异常的可能性。鉴于情况确实如此,声称它是一种有用的模式有什么意义呢?

    是否存在任何其他情况,其中复制操作可能会抛出(与被复制的对象无关),而不是内存耗尽?

1 个答案:

答案 0 :(得分:6)

赋值运算符的复制和交换惯用语产生强大的异常保证:构建新对象时,原始值不受影响。当重用为分配给对象分配的内存时,通常只有在没有涉及的操作可能抛出时才能实现强异常保证。特别是当涉及类模板时(如在std::vector<T>中),通常不能保证没有任何操作抛出(当然,std::vector<T>仅在赋值时提供基本的异常保证)。

通常,复制分配可以出于任何原因抛出。最有可能的是,他们不应该因为其他原因而不是分配资源,但CopyAssignable概念中没有任何内容禁止操作抛出。

我发现复制分配没有正确实施并且例如违反基本异常保证这一点很常见。这种情况的指标是当赋值运算符需要检查自我赋值时:如果实际需要自我赋值(而不仅仅是在那里,有时被定义为&#34;优化&#34; - 多久一次人们做自我分配......?),代码几乎肯定是错误的,很可能不保持基本的异常保证。因此,我建议使用复制和交换方法,除非有充分的理由不尽管我知道它使用了更多的内存(尽管问题很少,因为内存不足,至少不是在我正在研究的系统上,而是使用更多内存可能导致执行速度变慢。)

相关问题