私は移動のセマンティクスで少し苦労しています。私はその話題について多くのことを読んでいますが、答えが見つからなかった2つの具体的な問題があり、それをあなたに提示するのが好きです。存在しないオブジェクトの破壊
#include <iostream>
#include <cstddef>
class A
{
public:
A *ptr;
virtual ~A()
{
std::cout << "dtor" << std::endl;
delete ptr;
ptr=nullptr;
}
};
main()
{
A x, y;
x.ptr = &y;
}
// compile and link like this with g++: g++ -std=c++0x -lstdc++ code.cc
クラスAは、自身のメンバーを有することができる:
まず、私は、以下の例示的なコードを有しています。私はこの「複合パターン」の概念を使って階層を構築しています。しかし、この場合、オブジェクトxが破棄されると、そのデストラクタはオブジェクトyへのポインタを削除します。最後にオブジェクトyを破壊する必要がありますが、すでにエラーが発生しています...どうすればこの問題を解決できますか?
後者の場合は、次のようになります。
main()
{
A x, y;
y = std::move(x);
std::cout << "x.ptr: " << x.ptr << std::endl;
std::cout << "y.ptr: " << y.ptr << std::endl;
}
をここで、私は両方の参照は、両方が存在することを意味する同じであることがわかります。私はstd :: moveを使ってコンテンツをxからyに移動します。私はx.ptrが "空"であると思っていたでしょうか?
ありがとうございます!最初のケースで
乾杯
あなたは1つの 'delete'と' new'sを持っています。 – chris
テストすると、x.ptrとy.ptrの両方がnull値として取得されました。また、私は2番目のエラーを取得しませんでした。 –
2番目のケースに対処する: 'std :: move'はあまりそれ自体をしません、データの*移動*は移動コンストラクタによって行われます。デフォルトの移動コンストラクタはメンバワイズ移動を行いますが、 (ポインタのように)単なるコピーです。したがって、 'x.ptr'を" empty "に設定しません。 – vu1p3n0x