私はWindowsプラットフォームのC ++プログラマーです。Visual Studio2008を使用しています。
私は通常、メモリリークのあるコードになってしまいます。
通常、コードを調べてメモリリークを見つけますが、それは面倒であり、常に良いアプローチとは限りません。
有料のメモリリーク検出ツールを購入する余裕がないので、メモリリークを回避するための最善の方法を提案してもらいたいと思いました。
指示
必要なもの
オペレーターの基本を理解します。C ++演算子new
は、ヒープメモリを割り当てます。delete
オペレータは、ヒープメモリを解放します。ごとにnew
、delete
割り当てたのと同じメモリを解放するようにを使用する必要があります。
char* str = new char [30]; // Allocate 30 bytes to house a string.
delete [] str; // Clear those 30 bytes and make str point nowhere.
削除した場合にのみメモリを再割り当てします。以下のコードstr
では、2番目の割り当てで新しいアドレスを取得します。最初のアドレスは取り返しのつかないほど失われ、それが指している30バイトも失われます。現在、それらを解放することは不可能であり、メモリリークが発生しています。
char* str = new char [30]; // Give str a memory address.
// delete [] str; // Remove the first comment marking in this line to correct.
str = new char [60]; /* Give str another memory address with
the first one gone forever.*/
delete [] str; // This deletes the 60 bytes, not just the first 30.
それらのポインタの割り当てを監視します。すべての動的変数(ヒープに割り当てられたメモリ)は、ポインタに関連付ける必要があります。動的変数がそのポインターから関連付け解除されると、消去できなくなります。繰り返しますが、これによりメモリリークが発生します。
char* str1 = new char [30];
char* str2 = new char [40];
strcpy(str1, "Memory leak");
str2 = str1; // Bad! Now the 40 bytes are impossible to free.
delete [] str2; // This deletes the 30 bytes.
delete [] str1; // Possible access violation. What a disaster!
ローカルポインタに注意してください。関数で宣言するポインターはスタックに割り当てられますが、それが指す動的変数はヒープに割り当てられます。削除しないと、プログラムが関数を終了した後も保持されます。
void Leak(int x){
char* p = new char [x];
// delete [] p; // Remove the first comment marking to correct.
}
「削除」後の角括弧に注意してください。delete
単独で使用して、単一のオブジェクトを解放します。delete []
ヒープ配列を解放するには、角括弧とともに使用します。このようなことをしないでください:
char* one = new char;
delete [] one; // Wrong
char* many = new char [30];
delete many; // Wrong!
リークがまだ許可されている場合-私は通常、deleakerでそれを探しています(ここでチェックしてください:http://deleaker.com )。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加