1

「他の」オブジェクトの無効化を学ぶのに本当に苦労しています。ここで移動セマンティクスに関する大きな記事全体を読んだところですが、無効化について説明されていないため、がっかりしています。

「その他」のすべてのメンバーを無効にする必要があるのか​​ 、それとも動的に割り当てられたメモリを指しているポインタだけを無効にする必要があるのか​​ を説明してください。

ヒープ上にない (他のオブジェクトの) メンバーを無効にする必要があるのはなぜでしょうか? 正当な理由はありますか?

4

4 に答える 4

3

オブジェクトから移動した後も、クリーンアップされた後もそのデストラクタが呼び出されます。これは、所有するリソースを解放する必要があるかどうかを知る必要があることを意味します。したがって、ポインターが二重に削除されないように、それらを無効にする必要があります。

于 2012-04-26T20:03:02.110 に答える
2

移動元のオブジェクトを有効な状態のままにしておく必要があります。これは、そのオブジェクトを使用しても未定義の動作が発生しないことを意味すると考えています。実際には、これは、解放されたメモリを指すポインターを残さないことを意味します。オブジェクトが他のリソース (開いているソケット、ファイルなど) を保持している場合など、他のシナリオが存在する可能性があると想像できます。

于 2012-04-26T19:53:24.957 に答える
0

コンストラクターだけの場合、または動的に割り当てられた通常のポインターの場合でも、これが実際に意味するのかどうかはわかりません。

ただし、ポインタをNullyfingすると、ポインタにDangling pointer割り当てられたメモリが解放された後、ポインタがnullを指すため、ポインタが呼び出されるのを防ぐことができます。これらのポインターをさらに使用し、それらを逆参照すると、コアダンプが発生します。コアダンプは、そうでない場合よりも簡単に見つけることができます。そうしないと、予期しない結果が生じ、コアダンプを見つけるのが難しくなり、データが破損する可能性があります。

要するに、ポインタをnullyfingするだけで注意する必要があります。

于 2012-04-26T20:06:28.210 に答える
0

いつものように、「それは異なります」。

移動元のオブジェクトは、引き続き破棄するか、新しい値を割り当てる必要があります。これらの操作が機能する状態のままにしておく必要があります。

動的データへの「盗まれた」ポインターがある場合、それらを削除できるように、おそらく元のポインターにnullを割り当てる必要があります。整数メンバーの1つがポイントされたオブジェクトのサイズを保持している場合、それをゼロにする必要があるかもしれません(nullポインターと一致させるため)。他の値はそのままにしておくことができます。

于 2012-04-26T20:16:43.207 に答える