現在、割り当てられたメモリへのポインターを含むオブジェクトを使用してセマンティクスを正しく移動する方法を見つけようとしています。実際のストレージへの内部生ポインタを含む大きなデータ構造があります(効率上の理由から)。ここで、移動コンストラクターと move を追加しましたoperator=()
。これらのメソッドではstd::move()
、新しい構造へのポインタを指定しています。ただし、他の構造体からのポインターをどうするかはわかりません。
これが私がやっていることの簡単な例です:
class big_and_complicated {
// lots of complicated code
};
class structure {
public:
structure() :
m_data( new big_and_complicated() )
{}
structure( structure && rhs ) :
m_data( std::move( rhs.m_data ) )
{
// Maybe do something to rhs here?
}
~structure()
{
delete m_data;
}
private:
big_and_complicated * m_data;
}
int main() {
structure s1;
structure s2( std::move( s1 ) );
return 0;
}
今、私が理解していることstd::move( s1 )
からs2
、安全に実行できる唯一のことは、s1
そのコンストラクターを呼び出すことです。ただし、私が見る限り、これによりs1
、デストラクタに含まれるポインタが削除され、s2
役に立たなくなります。std::move()
したがって、ポインターを ing するときにデストラクタを安全にするために何かをしなければならないと推測しています。ここで行う最も安全な方法は0
、移動したオブジェクトでに設定することdelete
です。これまでのところ、この推論は正しいですか? または、std::move()
実際にポインターを無効にして、その使用を安全にするのに十分なほどスマートですか? これまでのところ、実際のテスト スイートでクラッシュは見られませんが、move-constructor が実際に呼び出されるかどうかは確認していません。