ソース オペランドを変更するコピー操作
コピー操作によるソース オブジェクトのデータ メンバーの変更
説明
この欠陥は、コピー コンストラクターまたはコピー代入演算子によって、そのソース オペランドの変更可能なデータ メンバーが変更された場合に発生します。
たとえば、次のコピー コンストラクター 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 で導入