このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ソース オペランドを変更するコピー操作
コピー操作によるソース オブジェクトのデータ メンバーの変更
説明
この欠陥は、コピー コンストラクターまたはコピー代入演算子によって、そのソース オペランドの変更可能なデータ メンバーが変更された場合に発生します。
たとえば、次のコピー コンストラクター A
はそのソース オペランド other
のデータ メンバー m
を変更します。
class A { mutable int m; public: ... A(const A &other) : m(other.m) { other.m = 0; //Modification of source } }
リスク
コピー コンストラクター (またはコピー代入演算子) を使用した次のようなコピー操作があります。
className new_object = old_object; //Calls copy constructor of className
old_object
をコピー先のオペランド new_object
にコピーします。操作後、コピー先のオペランドは未変更のソース オペランドのコピーになっていると想定されます。ソース オペランドがコピー中に変更されている場合、この想定に反することになります。修正方法
コピー操作でソース オペランドを変更しないようにします。
移動操作を実装するためにコピー コンストラクターでソース オペランドを変更する場合は、移動コンストラクターを代わりに使用します。移動コンストラクターは C++11 規格以降で定義されます。
例
結果情報
グループ: オブジェクト指向 |
言語: C++ |
既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: COPY_MODIFYING_SOURCE |
影響度: Medium |
バージョン履歴
R2018b で導入