2

C ++コードのこれらの行では、次のようになります。

int * p = new int(33);
delete(p);
*p = 13;
cout << *p << endl;

出力は13です。

Pは最初にヒープ上のアドレスを指し、次にdeleteキーワードを使用して、pに割り当てられたメモリアドレスの割り当てを解除しますが、メモリアドレスに23の値を割り当てることができます。これは、pが「int * p = new int(33)」の後に指しているヒープ上のアドレスと同じですか、それともpがdelete(p)を使用した後のスタック上のアドレスを指しているのでしょうか。

4

3 に答える 3

8

それでも同じアドレスを指しています(アドレスを印刷することでわかります)。メモリを解放した後、解放されたメモリがnullに割り当てられないために逆参照を試みないようにするために、ポインタを割り当てたり、ポインタに割り当てたりNULLすることがあります。これにより、次のようなコードを使用できます。nullptr0

if (p != nullptr)
    //do something with p, it hasn't been freed and set to nullptr

解放されたときにnullに設定されていない場合、これを行うのは困難ですが、スマートポインターは、上記のより安全で一貫性のある代替手段を提供することに注意してください。

正しい出力が得られる理由は、未定義の動作です。クラッシュしたり、爆発したり、動作したりする可能性があります。私はそれが働くことを選んだと思います。

于 2012-10-17T00:08:14.723 に答える
5

メモリ(OS)を管理している人に信号を削除pすると、基になるスペースが他の誰かによって自由に再割り当てされて自分で使用できるようになります。pただし、それでも同じメモリ位置を指し、逆参照してそのメモリにあるものの値を取得できます。そのメモリは他の誰かによって使用される可能性があるため、基になるビットは以前とは異なる可能性があることに注意してください。

于 2012-10-17T00:09:13.517 に答える
1

はい、それでもヒープを指していますが、そのメモリ位置は安定していません。OSはいつでもそれを再利用できるため、そのメモリ位置の値が設定した値であるとは限りません。

また、私が知る限り、すべての動的メモリ割り当てはスタックではなくヒープで行われます。スタックはパラメーターとローカル変数用に予約されています。

于 2012-10-17T00:12:35.147 に答える