クラスの一部の詳細が削除されました。特に、コンストラクタはDataStructure
オブジェクトを動的に割り当て、デストラクタはその割り当てを解除します。移動中にポインターを一方から他方にコピーした場合Widget
、両方Widget
の は同じ割り当てられたDataStructure
オブジェクトへのポインターを持ちます。次に、それらのオブジェクトが破壊されると、両方が試みdelete
ます。これにより、未定義の動作が発生します。これを回避するために、Widget
移動元の には、 に設定する内部ポインタがありますnullptr
。
これは、ムーブ コンストラクターを実装する際の標準的なパターンです。動的に割り当てられたオブジェクトの所有権をあるオブジェクトから別のオブジェクトに移動したいので、元のオブジェクトがそれらの割り当てられたオブジェクトを所有していないことを確認する必要があります。
DataStructure
ダイアグラム的には、次の状況から始めて、 の所有権を一方から他方に移動したいと考えてWidget
います。
┌────────┐ ┌────────┐
│ Widget │ │ Widget │
└───╂────┘ └────────┘
┃
▼
┌───────────────┐
│ DataStructure │
└───────────────┘
ポインターをコピーしただけの場合は、次のようになります。
┌────────┐ ┌────────┐
│ Widget │ │ Widget │
└───╂────┘ └───╂────┘
┗━━━━━━━━┳━━━━━━━┛
▼
┌───────────────┐
│ DataStructure │
└───────────────┘
その後、元のWidget
ポインターをnullptr
に設定すると、次のようになります。
┌────────┐ ┌────────┐
│ Widget │ │ Widget │
└────────┘ └───╂────┘
┃
▼
┌───────────────┐
│ DataStructure │
└───────────────┘
所有権が正常に転送され、Widget
未定義の動作を引き起こすことなく両方の を破棄できる場合。