2017-01-06 4 views
4
// move constructor 
    ArrayWrapper (ArrayWrapper&& other) 
     : _p_vals(other._p_vals ) 
     , _size(other._size) 
    { 
     other._p_vals = NULL; 
     other._size = 0; 
    } 

rvalueの参照に関するチュートリアルが見つかりました。我々が設定する必要がなぜ私は本当に理解していないother._p_vals = NULL;other._size = 0; 著者は説明する:C++での値の参照

をしかし、なぜ私たちはother._p_vals = NULLを設定する必要がありますか?理由は、 デストラクタです。一時オブジェクトがスコープから外れると、他のC++オブジェクトのすべての と同じように、デストラクタが実行されます。

それはスコープの外に出ないと、それは_p_valsを解放すると、そのデストラクタが実行され、 other._p_vals = NULL

を設定なぜわざわざ破壊されてしまった場合。私たちが今コピーしたのと同じ_p_vals!

私はコピーされていないと思ったのですが...間違っていますか?

我々はNULLにother._p_valsを設定しない 場合、移動は本当に 動きではないでしょう - それはちょうど私達が解放されたメモリの使用を開始 たら、後にクラッシュを紹介するコピーになります。これは移動の全体的なポイントです コンストラクタ:オリジナルを変更してコピーを避けるために、一時的に オブジェクト!

誰かが私の理解を助けることができますか?

+0

デストラクタは '_p_vals'(例えば' delete's)に何かをするコードを持っています。あなたがそれらの行を持っていない場合、あなたは実際にコピーして移動していません。 –

答えて

4

このクラスは、生のポインタを含んでいるので、我々はそれがそれを所有していると仮定することができますので、そのデストラクタのようなものを見なければなりません。私たちはotherの内部を「盗む」されているこの動きのコンストラクタで

ArrayWrapper::~ArrayWrapper() { 
    delete[] _p_vals; 
} 

を。 otherの内部を空白にしない場合(一貫した「空」状態にしておきますので、_size = 0も設定してください)、otherまたは新しいオブジェクトのいずれかが破棄されると、残っているオブジェクトが破棄されます現在削除されているデータがあります。

内部の共有は、他の人の内部を盗むのとは非常に異なるパターンです。

+0

しかし、とにかく破壊される他の一時的なオブジェクトはありませんか? – Samu

+2

必ずしもそうではありませんが、それがあたかもそうだとしましょう。それから、 'other'は破壊され、そのデストラクタで(適切に書かれていると仮定すると)、' delete'は '_p_vals'です。新しいオブジェクトはゴミを指しています。 – BoBTFish

+0

ありがとう、それは今意味があります! – Samu