これは基本的な質問だと確信していますが、どこにも答えが見つかりません (検索用語が間違っているためかもしれません)。
次のコードはメモリ リークを引き起こしていますか?
int * ptr= new int(15);
ptr= new int(25);
new
同じポインターでオペレーターを 2 回目に呼び出す前に、最初のポインターを削除する必要がありますか?
これは基本的な質問だと確信していますが、どこにも答えが見つかりません (検索用語が間違っているためかもしれません)。
次のコードはメモリ リークを引き起こしていますか?
int * ptr= new int(15);
ptr= new int(25);
new
同じポインターでオペレーターを 2 回目に呼び出す前に、最初のポインターを削除する必要がありますか?
ptr
はい、別の への呼び出しで上書きしていnew
ます。したがって、最初のポインターは失われます。
同じ変数を再利用したい場合は、最初のポインターptr
だけを安全に再利用してください。delete
次のコードはメモリ リークを引き起こしていますか?
はい、そうです。
同じポインターで new 演算子を 2 回目に呼び出す前に、最初のポインターを削除する必要がありますか?
はい、それへのすべての参照を失い、解放できなくなる前に、delete
何かを割り当てる必要があります。new
実際に物事を少し明確にするだけです。
New
ヒープから「ランダムな」ポインターを提供します。唯一の保証は、ポインターが指すメモリのブロックに要求されたバイト数を収めることができることです。
次の点を考慮してください。
int *x = new int;
Pointerは0x12345678x
を指すようになり、そこに整数の場所があり、この整数に到達できる唯一の方法は、pointer に格納されているアドレスを使用することです。 x
ここで、もう一度 new を呼び出したとします。0x12345678x = new int;
の整数ルームは「予約済み」のままですが、ポインターは別の場所を指します。たとえば、新しい整数用に作成された新しい「スポット」がある0x87654321を指し、前のポインターへのポインターは永遠に失われます。 long は、ヒープの元の部分を指します。
delete
この問題の解決策は、ポインター自体に触れないポインターを呼び出すことx
です。ポインターがたまたま指しているヒープからメモリの割り当てを解除するだけです。(そして、その直接的な結果として、x
それ自体が変更new
されますが、値が割り当てられるという理由だけで...)
new
これで、再び自由に電話をかけることができます。
(編集)はい、new
コンストラクターを呼び出しますが、それはここでのポイントではありません。
はい、はい。を使用するたびnew
に、対応する を使用する必要がありますdelete
。