// 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を設定しない 場合、移動は本当に 動きではないでしょう - それはちょうど私達が解放されたメモリの使用を開始 たら、後にクラッシュを紹介するコピーになります。これは移動の全体的なポイントです コンストラクタ:オリジナルを変更してコピーを避けるために、一時的に オブジェクト!
誰かが私の理解を助けることができますか?
デストラクタは '_p_vals'(例えば' delete's)に何かをするコードを持っています。あなたがそれらの行を持っていない場合、あなたは実際にコピーして移動していません。 –