2016-11-20 4 views
-2

は、私がこのような何かを言う:ポインタを再割り当てするときに手動メモリ管理を処理する方法は?

int* arr = new int[30]; 
int* newArr = new int[30]; 
arr[15] = 5; 
newArr[15] = 9; 
arr = newArr; 
delete[] newArr; 

最後の行は、それによっても、ARRを解放し、newArrが解放されます。しかし、5を含む記憶のブロックには何が起こったでしょうか?今は再びアクセスできないメモリリークですか?もしそうなら、元の配列をうまく再割り当てすると同時に、このメモリーが漏れないようにするにはどうすればよいですか?

+1

_ "これにより、arr" _ Huh?も解放されます。 –

+0

@πάνταῥεῖarrとnewArrは同じことを指していますので、私は 'delete [] newArr'でそれらの両方を解放すると言って間違っていますか? –

+0

同じことを両方とも解放していますか?どういう意味ですか? – juanchopanza

答えて

0

最後の行は、それによってまた、あなたがpが、メモリブロックpによってポイントを解放していないfree(p)arr

を解放し、newArrが解放されます。


arr = newArrを使用すると、基本的に、あなたは、もはやあなたのプログラムの実行中に、後の時点で、それを解放しないことを意味し、もともとarrで指された動的に割り当てられたメモリブロックの「トレースを失った」しましたしたがって、メモリリークが避けられなくなる。

1
int* arr = new int[30]; 
int* newArr = new int[30]; 
arr[15] = 5; 
newArr[15] = 9; 
arr = newArr; 
delete[] newArr; 

最後の行は、それによっても、ARRを解放し、newArrが解放されます。

かなりです。 newArrarrは、メモリのブロックを指す名前に過ぎません。あなたは本当に "newArrを解放していません"、あなたは現在指しているメモリブロックを解放します。その瞬間には現在arrが指し示しているのと同じブロックになります。

しかし、5を含むメモリブロックには何が起こったのですか?

これはまだ使用されているとマークされていますが、プログラムの中にはそれを再度指すことはできません。あなたが今まで持っていたポインタはarrでしたが、arrを別のものに割り当てました。

今は再びアクセスできないメモリリークはありますか?

正確に。その場合は、同時に成功し 元の配列を再割り当てしながら、

、私は、このメモリは が漏洩することは決してできないことを確認することについてどのように行くべきですか?

このダイナミックアレイはナンセンスで忘れて、std::vectorを使用してください。

std::vector<int> arr(30); 
std::vector<int> newArr(30); 
arr[15] = 5; 
newArr[15] = 9; 
arr = newArr; 
+0

"このダイナミックな配列はナンセンスで忘れて、' std :: vector'を使ってください。実際にこの問題に遭遇したので、実際にはC++で自分自身でベクタークラスを実装しようとしていたので、独自のベクトルの実装ではstd :: vectorを使用してください。ベクトル実装の基になる配列がある時点でサイズ変更される必要があるため、ポインタが使用されましたが、メモリリークを発生させずにその方法を確認するのは難しいです... –

+0

@CoffeeMaker: 'std :: vector''s実装は 'new []'を使いませんが、新しい配置(スマートな方法で事前にメモリを予約することができます)。これはあなたに多くの助けになるわけではありません。あなたは、古いメモリが解放されるように代入演算子を実装する方法を学ばなければなりません。ヒント:デストラクタで空きメモリを使い、 "Rule Of Three"を調べ、 "Copy&Swap"イディオムで代入を実装します。 –

関連する問題