1. ホーム
  2. c++

[解決済み】C++のコード/プロジェクトでメモリリークを見つけるには?

2022-04-09 09:38:43

質問

私はWindowsプラットフォームでC++プログラマをしています。Visual Studio 2008を使用しています。

私は通常、メモリリークのあるコードに行き着きます。

通常はコードを検査することでメモリリークを見つけるのですが、面倒なので必ずしも良い方法とは言えません。

有料のメモリリーク検出ツールは買えないので、メモリリークを回避するための最善の方法を皆さんに提案してもらいたかったのです。

  1. プログラマーがどのようにメモリリークを発見できるのか知りたい。
  2. プログラム中にメモリリークがないことを確認するための基準や手順がありますか?

どのように解決するのですか?

操作説明

必要なもの

  • C++の熟練度
  • C++コンパイラ
  • デバッガなどの調査用ソフトウェアツール

1

演算子の基本を理解する。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.

2

削除した場合のみ、メモリを再割り当てする。以下のコードでは 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.

3

ポインタの割り当てに注意してください。すべての動的変数(ヒープ上に割り当てられたメモリ)は、ポインタと関連付ける必要があります。動的変数がそのポインタから切り離されると、その変数を消去することは不可能になります。この場合も、メモリリークになります。

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!

4

ローカルポインタの扱いに注意してください。関数内で宣言したポインタはスタック上に確保されますが、それが指し示す動的変数はヒープ上に確保されます。これを削除しないと、プログラムがその関数を終了した後でも、そのポインタは持続します。

void Leak(int x){

char* p = new char [x];

// delete [] p; // Remove the first comment marking to correct.

}

5

delete.quot;の後にある角括弧に注目します。 delete を単体で使用すると、1つのオブジェクトを解放することができます。使用方法 delete [] を角括弧で囲むとヒープ配列が解放されます。このようなことはしないでください。

char* one = new char;

delete [] one; // Wrong

char* many = new char [30];

delete many; // Wrong!

6

まだ漏れが許されるのであれば - 私は通常deleakerでそれを求めています(ここで確認してください。 http://deleaker.com ).