-1

私はC++の新機能、つまりmoveコンストラクターと代入について学習しようとしていますが、興味深い例X::operator=(X&&)を見つけまし たが、私がまったく理解していない唯一のことは、move ctorと代入演算子(以下のコードでマークされています)の1行です。

MemoryBlock(MemoryBlock&& other)
   : _data(NULL)
   , _length(0)
{
   std::cout << "In MemoryBlock(MemoryBlock&&). length = " 
             << other._length << ". Moving resource." << std::endl;

   // Copy the data pointer and its length from the 
   // source object.
   _data = other._data;
   _length = other._length;

   // Release the data pointer from the source object so that
   // the destructor does not free the memory multiple times.
   other._data = NULL;
   other._length = 0;//WHY WOULD I EVEN BOTHER TO SET IT TO ZERO? IT DOESN'T MATTER IF IT'S ZERO OR ANYTHING ELSE IT IS JUST A VALUE.
}

だから私の質問は:lenght_の値をゼロに設定する必要がありますか、それともそのままにしておくことができますか?メモリリークが発生することはなく、1つの表現でafaicsが少なくなります。

4

6 に答える 6

6

「movedfrom」オブジェクトは最終的には破壊されるため、一貫した状態のままにしておく必要があります。もちろん、これをどのように行うかはオブジェクトによって異なります。この場合、データポインタをゼロにして、長さをゼロに設定することを意味しているようです。

于 2010-06-27T17:02:22.640 に答える
0

明らかに、プログラマーは長さが常に正しい値を持つべきであると決定しました。設定しないと、デストラクタのコードは正しいものを出力しなくなります。

std::cout << "In ~MemoryBlock(). length = "
                << _length << ".";
于 2010-06-27T17:06:15.913 に答える
0

_lengthおよび_dataは意味的に関連するアイテムです。オブジェクトが一貫性のある状態になるには、_lengthが指すブロックにあるメモリの量を常に通知する必要があります_data_data100ブロックを指す場合_lengthは100になります。1_dataブロックを指す場合は1になります。何も指していなければ(NULL)、0になります。それ以外の場合、がNULLで100の場合、オブジェクトは次のようになります。一貫性のない状態。私がする時:_length_data_length_data_length

for (int i = 0; i < _length; ++i)
{
  // do something with _data[i], such as:
  _data[i] = 0;
}

墜落してはいけません。正しく設定_lengthしないとクラッシュします。本当の問題は、なぜオブジェクトを意図的に一貫性のない状態のままにして、クラッシュにつながるのかということです。

于 2010-06-27T17:55:43.057 に答える
0

この質問に対する明確な答えを得るのは難しいです。移動セマンティクスは新しく、C++コミュニティはまだそれを正しく使用する方法を学んでいます。

私が見た合理的なルールの1つは、「移動した」オブジェクトは安全に破壊し、新しい値を割り当てることができる必要があるということです。そのルールを満たすためにゼロに設定_lengthする必要はありません。率直に言って、intが無効な状態を示すのに適切な値が何であるかはわかりません。たぶんあなたの場合は-1?

于 2010-06-27T19:36:26.397 に答える
0

データの移動元のオブジェクトは一時的なものではない可能性があります(たとえば、std :: moveを使用できます)。オブジェクトを無効な状態のままにしておくのは不適切な形式です。

于 2010-06-27T19:43:15.553 に答える
0

値をゼロに設定すると、一貫性のみが公開されます。ただし、答えは実際には、オブジェクトの破棄に_lengthをどのように使用するかによって異なります。_dataを削除する必要があるかどうかを決定するためにlengthが使用されない場合(移動されたオブジェクトがスコープから外れる場合)、オブジェクトを移動するときに_lengthを無視しても安全であると言えます。派生型でこの一貫性を維持し、_lengthを無視するという決定が文書化されていることを確認してください。

于 2012-10-07T12:43:21.117 に答える