C ++コード/プロジェクトでメモリリークを見つける方法は?

Chris_vr

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

私は通常、メモリリークのあるコードになってしまいます。

通常、コードを調べてメモリリークを見つけますが、それは面倒であり、常に良いアプローチとは限りません。

有料のメモリリーク検出ツールを購入する余裕がないので、メモリリークを回避するための最善の方法を提案してもらいたいと思いました。

  1. プログラマーがメモリリークを見つける方法を知りたいです。
  2. プログラムにメモリリークがないことを確認するために従うべき標準または手順はありますか?
ジョンスミス

指示

必要なもの

  • C ++の習熟度
  • C ++コンパイラ
  • デバッガーおよびその他の調査ソフトウェアツール

1

オペレーターの基本を理解します。C ++演算子newは、ヒープメモリを割り当てます。deleteオペレータは、ヒープメモリを解放します。ごとにnewdelete割り当てたのと同じメモリを解放するようにを使用する必要があります。

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単独で使用して、単一のオブジェクトを解放します。delete []ヒープ配列を解放するには、角括弧とともに使用します。このようなことをしないでください:

char* one = new char;

delete [] one; // Wrong

char* many = new char [30];

delete many; // Wrong!

6

リークがまだ許可されている場合-私は通常、deleakerでそれを探しています(ここでチェックしてください:http://deleaker.com )。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C#プロジェクト(ソリューション)でハードコードされたすべての値を見つける方法は?

分類Dev

C#のジェネリックリストで一致しないレコードを見つける方法

分類Dev

C++ プロジェクトで再帰関数名リストを見つける方法

分類Dev

私のC ++コードでメモリリークを見つけようとしています

分類Dev

C ++でオブジェクト指向プログラミングを使用してボックスのボリュームを見つける

分類Dev

異なるリビジョンで同じコードを共有するC ++プロジェクトを操作するGitの方法は何ですか?

分類Dev

FactoryでジェネリックC#メソッドをオーバーロードする方法は?

分類Dev

C ++アプリケーションでメモリリークを見つけるためのダンプメモリ

分類Dev

値がC#のオブジェクトのリストである場合、辞書のキーを見つける方法は?

分類Dev

メインプロジェクトに追加のインクルードディレクトリを使用して、VisualStudioでC ++用のUnitTestプロジェクトをセットアップする正しい方法は何ですか?

分類Dev

C ++ファイルのオブジェクトコードを見つける方法

分類Dev

Cプリプロセッサでglibcバージョンを見つける方法は?

分類Dev

コントローラー(MVC)でリモートオブジェクトを呼び出す方法 c#

分類Dev

SWIG:ヘッダーと共有ライブラリのみを使用してPerl用のC ++をラップすると、ロード可能なオブジェクトエラーを見つけることができません

分類Dev

CMakeにCライブラリプロジェクトで自分のテストを見つけさせるにはどうすればよいですか?

分類Dev

C#の列を持つリストでオブジェクトを見つける方法

分類Dev

Cでメモリリークを見つけることができません

分類Dev

コンソールアプリケーションプロジェクトではないプロジェクトから、Main()メソッドを含むC#クラスを手動で実行できますか?

分類Dev

Cアプリケーションでメモリリークを見つけることができません

分類Dev

Cのメモリからスクリプトをロードする

分類Dev

ジェネリックC#ジェネリックオブジェクトのプロパティをパラメーターで渡す方法

分類Dev

C ++ネイティブコードを使用してAndroidStudioプロジェクトでGLES2にリンクする方法

分類Dev

C#Linqによってリストボックスデータソース(List <T>でバインドされている)でオブジェクトのインデックスを見つける方法

分類Dev

Visual Studio C ++プロジェクトでiostreamヘッダーファイルを見つけるにはどうすればよいですか?

分類Dev

同じソリューションでac#プロジェクトからc ++プロジェクトを参照する方法はありますか?

分類Dev

別のディレクトリからC#でホームフォルダを見つける方法は?

分類Dev

C ++プロジェクトからマークダウンドキュメントを生成する方法は?

分類Dev

IVsSolution.CreateProjectを使用して既存のアンロードされたc#プロジェクトをプログラムでリロードする方法

分類Dev

オブジェクトのリストがありますが、コードを整理する方法が見つかりません。C#の特定のインデックスでオブジェクトを更新しようとしています

Related 関連記事

  1. 1

    C#プロジェクト(ソリューション)でハードコードされたすべての値を見つける方法は?

  2. 2

    C#のジェネリックリストで一致しないレコードを見つける方法

  3. 3

    C++ プロジェクトで再帰関数名リストを見つける方法

  4. 4

    私のC ++コードでメモリリークを見つけようとしています

  5. 5

    C ++でオブジェクト指向プログラミングを使用してボックスのボリュームを見つける

  6. 6

    異なるリビジョンで同じコードを共有するC ++プロジェクトを操作するGitの方法は何ですか?

  7. 7

    FactoryでジェネリックC#メソッドをオーバーロードする方法は?

  8. 8

    C ++アプリケーションでメモリリークを見つけるためのダンプメモリ

  9. 9

    値がC#のオブジェクトのリストである場合、辞書のキーを見つける方法は?

  10. 10

    メインプロジェクトに追加のインクルードディレクトリを使用して、VisualStudioでC ++用のUnitTestプロジェクトをセットアップする正しい方法は何ですか?

  11. 11

    C ++ファイルのオブジェクトコードを見つける方法

  12. 12

    Cプリプロセッサでglibcバージョンを見つける方法は?

  13. 13

    コントローラー(MVC)でリモートオブジェクトを呼び出す方法 c#

  14. 14

    SWIG:ヘッダーと共有ライブラリのみを使用してPerl用のC ++をラップすると、ロード可能なオブジェクトエラーを見つけることができません

  15. 15

    CMakeにCライブラリプロジェクトで自分のテストを見つけさせるにはどうすればよいですか?

  16. 16

    C#の列を持つリストでオブジェクトを見つける方法

  17. 17

    Cでメモリリークを見つけることができません

  18. 18

    コンソールアプリケーションプロジェクトではないプロジェクトから、Main()メソッドを含むC#クラスを手動で実行できますか?

  19. 19

    Cアプリケーションでメモリリークを見つけることができません

  20. 20

    Cのメモリからスクリプトをロードする

  21. 21

    ジェネリックC#ジェネリックオブジェクトのプロパティをパラメーターで渡す方法

  22. 22

    C ++ネイティブコードを使用してAndroidStudioプロジェクトでGLES2にリンクする方法

  23. 23

    C#Linqによってリストボックスデータソース(List <T>でバインドされている)でオブジェクトのインデックスを見つける方法

  24. 24

    Visual Studio C ++プロジェクトでiostreamヘッダーファイルを見つけるにはどうすればよいですか?

  25. 25

    同じソリューションでac#プロジェクトからc ++プロジェクトを参照する方法はありますか?

  26. 26

    別のディレクトリからC#でホームフォルダを見つける方法は?

  27. 27

    C ++プロジェクトからマークダウンドキュメントを生成する方法は?

  28. 28

    IVsSolution.CreateProjectを使用して既存のアンロードされたc#プロジェクトをプログラムでリロードする方法

  29. 29

    オブジェクトのリストがありますが、コードを整理する方法が見つかりません。C#の特定のインデックスでオブジェクトを更新しようとしています

ホットタグ

アーカイブ