Object *p = new Object();
delete p;
pを削除すると、ヒープ上のオブジェクト割り当てが削除されます。しかし、p自体は正確にどうなりますか?スタックから削除されていますか?または、それはまだスタックにあり、以前にオブジェクトを保持していたメモリのアドレスがまだ含まれていますか?
Object *p = new Object();
delete p;
pを削除すると、ヒープ上のオブジェクト割り当てが削除されます。しかし、p自体は正確にどうなりますか?スタックから削除されていますか?または、それはまだスタックにあり、以前にオブジェクトを保持していたメモリのアドレスがまだ含まれていますか?
p
はまだスタック上にあり、Object
削除したばかりのアドレスを保持しています。を自由に再利用p
して、他の割り当てられたデータまたはNULL
/を指すように割り当てることができnullptr
ます。
p
変数ですよね。したがって、その存続期間は、実行時ではなく、コンパイル時に決定されます。
ここにあるのはダングリングポインターと呼ばれます。これは、通常は絶対に避けたいモンスターです。
実行するときdelete p
。が指すメモリp
が削除されます。
delete
〜=デストラクタ+割り当て解除
これは、メモリが解放されたことを示すdelete
用語です。OSのメモリの総量や変数p
自体には影響しません。p
それでも、システムによって再利用されたメモリを指しているため、ダングリングポインタになります。
ポインタ変数は存続しますが、その値は無効になります。別の有効なポインタまたはnullポインタを割り当てる以外の操作を行うと、未定義の動作が発生します。ポインタ値が変更されないという保証はありません。