3

これは基本的な質問だと確信していますが、どこにも答えが見つかりません (検索用語が間違っているためかもしれません)。

次のコードはメモリ リークを引き起こしていますか?

int * ptr= new int(15);
ptr= new int(25);

new同じポインターでオペレーターを 2 回目に呼び出す前に、最初のポインターを削除する必要がありますか?

4

4 に答える 4

5

ptrはい、別の への呼び出しで上書きしていnewます。したがって、最初のポインターは失われます。

同じ変数を再利用したい場合は、最初のポインターptrだけを安全に再利用してください。delete

于 2012-05-15T18:42:41.523 に答える
5

次のコードはメモリ リークを引き起こしていますか?

はい、そうです。

同じポインターで new 演算子を 2 回目に呼び出す前に、最初のポインターを削除する必要がありますか?

はい、それへのすべての参照を失い、解放できなくなる前に、delete何かを割り当てる必要があります。new

于 2012-05-15T18:42:55.297 に答える
5

実際に物事を少し明確にするだけです。
Newヒープから「ランダムな」ポインターを提供します。唯一の保証は、ポインターが指すメモリのブロックに要求されたバイト数を収めることができることです。

次の点を考慮してください。

int *x = new int;Pointerは0x12345678xを指すようになり、そこに整数の場所があり、この整数に到達できる唯一の方法は、pointer に格納されているアドレスを使用することです。 x

ここで、もう一度 new を呼び出したとします。0x12345678x = new int; の整数ルームは「予約済み」のままですが、ポインターは別の場所を指します。たとえば、新しい整数用に作成された新しい「スポット」がある0x87654321を指し、前のポインターへのポインターは永遠に失われます。 long は、ヒープの元の部分を指します。

deleteこの問題の解決策は、ポインター自体に触れないポインターを呼び出すことxです。ポインターがたまたま指しているヒープからメモリの割り当てを解除するだけです。(そして、その直接的な結果として、xそれ自体が変更newされますが、値が割り当てられるという理由だけで...)

newこれで、再び自由に電話をかけることができます。

(編集)はい、newコンストラクターを呼び出しますが、それはここでのポイントではありません。

于 2012-05-15T18:48:48.503 に答える
4

はい、はい。を使用するたびnewに、対応する を使用する必要がありますdelete

于 2012-05-15T18:42:23.850 に答える