2

次のコードがあるとします。

int *q = new int(42), *r = new int(100);
r = q;

rは、 と同じ動的に割り当てられたオブジェクトを指すようになりますq。の初期化中に作成されたオブジェクトはどうなりますrか? それはまだ有効ですか?いかがですdeleteか?

私はそれを書いていることを知っています:

delete q;

q と r の両方を無効にします。私がした場合:

delete r;

これは q と r の両方を無効にしませんか?

たとえそれがあったとしても、int値が 100 の元のオブジェクトはまだぶらぶらしていませんか?

4

3 に答える 3

7

の初期化中に作成されたオブジェクトはどうなりますrか?

何もない。

それはまだ有効ですか?

はい。

いかがですdeleteか?

できません。あなたはそれへの唯一のポインタを失いました。これは、プログラムの存続期間中 (一部の原始的なオペレーティング システムではそれ以降も) バックグラウンドに潜んでいます。これは、メモリ リークと呼ばれます。

これは、生のポインターを使用してリソースを管理しない多くの正当な理由の 1 つです。スマート ポインターを使用した場合、リークはありません。new実際に動的割り当てが必要でない限り、これは避けるべき良い理由でもあります。

qこれは両方とも無効になりませんrか?

はい。オブジェクトを削除すると、そのオブジェクトへのすべてのポインターが無効になります。これは、生のポインターを使用しないもう 1 つの正当な理由です。それらが無効化されたことを伝える方法はありません。

于 2013-09-11T17:17:42.470 に答える
2

ご質問への回答は次のとおりです。

  1. とにかく参照していないため、そのオブジェクトを削除することはできず、メモリリークが発生します.(スマートポインタを使用してみてください)

  2. オブジェクトを参照するポインターがない限り、オブジェクトを削除することはできません。

  3. オブジェクトを削除すると、そのオブジェクトを指すすべてのポインターが無効になります。

于 2013-09-11T17:18:34.043 に答える
1

この割り当てにより、メモリ リークが発生します。

r = q;

以前に指されたメモリrはまだ有効ですが、それへのポインタがなくなり、できなくdeleteなります。この時点deleteqまたはを呼び出すと、両方が無効になります。r

于 2013-09-11T17:18:47.773 に答える