解放された場所へのポインター未定義の動作ですか?
int *p = new int;
*p = 10;
delete p;
*p = 10;
cout << *p << endl;
解放された場所へのポインター未定義の動作ですか?
int *p = new int;
*p = 10;
delete p;
*p = 10;
cout << *p << endl;
割り当て解除された場所へのポインタが存在するだけでは、それ自体が未定義の動作ではありません。ただし、そのポインタを逆参照しようとすると、未定義の動作が発生します。
削除されたポインターの逆参照は未定義の操作です。やらないでください。
これは未定義の動作です:
標準ライブラリの割り当て解除関数に指定された引数が null ポインター値ではないポインターである場合、割り当て解除関数は、ポインターによって参照されるストレージの割り当てを解除し、割り当て解除されたストレージの任意の部分を参照するすべてのポインターを無効にします。無効なポインター値を使用した場合 (解放関数に渡すことを含む) の影響は未定義です。- C++ '03 3.7.3.2
最初の行で行うように、メモリを割り当てて新しいポインターを作成する場合
int *p = new int;
オペレーティングシステムに、好きなだけ使用できるメモリを生成するように要求しています。その後、その場所に何かを置くことができます。
*p = 10;
このメモリは、必要なだけ使用できます。その後delete
、次の行で行うように、 を呼び出して、オペレーティング システムに使用が終了したことを伝えることができます。
delete p;
オペレーティング システムはメモリを使用できるようになりましたが、そのメモリを使用して何かを実行する場合と実行しない場合があります。他のメモリを大量に割り当てると、新しいメモリ範囲にこのメモリが含まれる可能性があります。オペレーティング システムは、このメモリを別のものに譲るかもしれませんし、そうでないかもしれません。
*p = 10;
次に、このメモリの場所を再利用して、再度 10 に設定します。その間、他に何も起こっておらず、これはかなり単純なプログラムであるため、オペレーティング システムはそのメモリ ブロックに対して他に何もしていないため、この場合に設定しても大きな影響はありません。
cout << *p << endl;
繰り返しになりますが、現在はオペレーティング システムがメモリを所有していますが、この時点では何もしていない可能性があります。滞在が正式に終わった後、ホテルの部屋に滞在するようなものです。部屋が後で別の人に使用されているのか、それとも空のままなのかがわからないため、そこに滞在できる場合とできない場合があります。あなたは投げ出されるかもしれませんし、安全かもしれません。