次の場合:
ClassType *foo = new ClassType();
ClassType *moo = foo;
delete foo;
そして先に進みます。まだダングリング ポインターはありますか? あなたは「新規」を1つだけ宣言して削除したので、私はノーだと思いましたが、確かにしたい...
ありがとう
次の場合:
ClassType *foo = new ClassType();
ClassType *moo = foo;
delete foo;
そして先に進みます。まだダングリング ポインターはありますか? あなたは「新規」を1つだけ宣言して削除したので、私はノーだと思いましたが、確かにしたい...
ありがとう
1 つのオブジェクトを作成して削除しました。両方のポインターは、そのオブジェクトが以前に占有していたメモリ アドレスを指していますが、オブジェクトは削除されています。一般に、これはダングリング ポインターの受け入れられた定義です。これは、アクティブなオブジェクトが含まれていないメモリを指すものです。
いずれかのポインタを介して削除されたオブジェクトにアクセスしようとしない限り、メモリ リークはなく、プログラムで問題が発生することはありません。
std::shared_ptr や std::unique_ptr などを使用すると、より安全な方法でメモリを管理できる場合があります。
C ++では、delete
演算子は指定された引数のデストラクタを呼び出し、割り当てられたメモリnew
をヒープに戻します。限目。これ以上のことは何もしません。つまり、ヒープ上の場所を指していたポインタは、割り当てが解除されたばかりのメモリの場所を指しているだけです。したがって、これらのポインター変数には、以前にポイントしていたアドレスが引き続き含まれています。これは「ダングリングポインタ」と呼ばれます。moo
これで、-とafterfoo
を割り当てると、ポインタが有効な場所を指しているのか、NULLを指しているのかを簡単に識別できます。NULL
delete
ぶら下がっているポインターを意味する場合、はい、ポインターは既に削除されているものを指しているためmoo
、foo
現在は無効です。
以下で作成された同じ動的オブジェクト上のfooおよびmooポイント:
ClassType *foo = new ClassType();
したがって、foo も削除すると、 mooも「削除」されるか、空のポインターになります。