0

次の場合:

ClassType *foo = new ClassType();
ClassType *moo = foo;
delete foo;

そして先に進みます。まだダングリング ポインターはありますか? あなたは「新規」を1つだけ宣言して削除したので、私はノーだと思いましたが、確かにしたい...

ありがとう

4

4 に答える 4

3

1 つのオブジェクトを作成して削除しました。両方のポインターは、そのオブジェクトが以前に占有していたメモリ アドレスを指していますが、オブジェクトは削除されています。一般に、これはダングリング ポインターの受け入れられた定義です。これは、アクティブなオブジェクトが含まれていないメモリを指すものです。

いずれかのポインタを介して削除されたオブジェクトにアクセスしようとしない限り、メモリ リークはなく、プログラムで問題が発生することはありません。

std::shared_ptr や std::unique_ptr などを使用すると、より安全な方法でメモリを管理できる場合があります。

于 2012-09-07T07:11:30.443 に答える
2

C ++では、delete演算子は指定された引数のデストラクタを呼び出し、割り当てられたメモリnewをヒープに戻します。限目。これ以上のことは何もしません。つまり、ヒープ上の場所を指していたポインタは、割り当てが解除されたばかりのメモリの場所を指しているだけです。したがって、これらのポインター変数には、以前にポイントしていたアドレスが引き続き含まれています。これは「ダングリングポインタ」と呼ばれます。mooこれで、-とafterfooを割り当てると、ポインタが有効な場所を指しているのか、NULLを指しているのかを簡単に識別できます。NULLdelete

于 2012-09-07T08:20:58.517 に答える
1

ぶら下がっているポインターを意味する場合、はい、ポインターは既に削除されているものを指しているためmoofoo現在は無効です。

于 2012-09-07T07:03:51.493 に答える
-1

以下で作成された同じ動的オブジェクト上のfooおよびmooポイント:

ClassType *foo = new ClassType();

したがって、foo も削除すると、 mooも「削除」されるか、空のポインターになります。

于 2012-09-07T07:11:16.223 に答える