メモリリーク検出
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
メモリリークはC/C++環境下におて
malloc関数で確保されたメモリをfree関数で解放し忘れた場合...
C++のnewも内部的にはmallocしているため同様にメモリリーク...
これのまずいところは、プログラムを終了しても使われたメモ...
つまり、メモリ解放を忘れたプログラムを起動するたびに
使えるメモリ領域が減っていき、システムの性能が低下したり...
最悪の場合、アプリが落ちたり、システムを再起動する必要が...
メモリリークは特にメモリが限られている環境(例えば携帯電...
また、原因が見つかりにくいエラーなので必ずメモリリークは...
以下にVC++でメモリリークの検出とメモリリーク箇所を特定す...
#include <crtdbg.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
// CRTメモリリーク検出用
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _C...
// CRTメモリリーク箇所検出
//_CrtSetBreakAlloc(58);
int* a = (int*)malloc(sizeof(int) * 4);
//free(a); // freeし忘れでメモリリーク発生
return 0;
}
メモリリーク検出には次のヘッダーが必要です
#include <crtdbg.h>
プログラムの先頭に次のコードを挿入します
// CRTメモリリーク検出用
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CR...
メモリリークを検出するにはデバック開始を選択しプログラム...
&ref(debug.png);
すると、プログラム終了時に出力の欄に次のように出るはずです
Detected Memory leaks!
以下がメモリリークを発生しているメモリを表わしています
&ref(isleak.png);
{58}となっているのがメモリリークを起こしているメモリ番号...
人によって違う番号が出てるかも知れません
プログラム上のメモリリークの発生している箇所を探すには次...
// CRTメモリリーク箇所検出
_CrtSetBreakAlloc(58);
ここでは58としていますが、先ほどのメモリリークが発生して...
再度デバック起動をすると、プログラムが途中で止まります
&ref(leak.png);
この時、呼び出し履歴の欄を見てください
呼び出し履歴には関数がどの順番で呼び出されたのかの履歴が...
上から4行はmalloc関数の内部での呼び出し行を示しているの...
直接の原因となっているのはmalloc関数をプログラム上で呼び...
赤枠の行をダブルクリックします
すると、メモリリークの原因となっているmalloc関数を呼び出...
&ref(error.png);
緑の矢印が原因となっている行を指します
これでメモリリークを起こしているプログラム行の特定ができ...
ここでは単純なプログラムでしたが
ソースコードが複数ファイルある場合でも検出と箇所の特定が...
巨大なプログラムになるほどデバックは大変になりますが
この方法でメモリリークの除去は可能となるので是非有効活用...
終了行:
メモリリークはC/C++環境下におて
malloc関数で確保されたメモリをfree関数で解放し忘れた場合...
C++のnewも内部的にはmallocしているため同様にメモリリーク...
これのまずいところは、プログラムを終了しても使われたメモ...
つまり、メモリ解放を忘れたプログラムを起動するたびに
使えるメモリ領域が減っていき、システムの性能が低下したり...
最悪の場合、アプリが落ちたり、システムを再起動する必要が...
メモリリークは特にメモリが限られている環境(例えば携帯電...
また、原因が見つかりにくいエラーなので必ずメモリリークは...
以下にVC++でメモリリークの検出とメモリリーク箇所を特定す...
#include <crtdbg.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
// CRTメモリリーク検出用
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _C...
// CRTメモリリーク箇所検出
//_CrtSetBreakAlloc(58);
int* a = (int*)malloc(sizeof(int) * 4);
//free(a); // freeし忘れでメモリリーク発生
return 0;
}
メモリリーク検出には次のヘッダーが必要です
#include <crtdbg.h>
プログラムの先頭に次のコードを挿入します
// CRTメモリリーク検出用
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CR...
メモリリークを検出するにはデバック開始を選択しプログラム...
&ref(debug.png);
すると、プログラム終了時に出力の欄に次のように出るはずです
Detected Memory leaks!
以下がメモリリークを発生しているメモリを表わしています
&ref(isleak.png);
{58}となっているのがメモリリークを起こしているメモリ番号...
人によって違う番号が出てるかも知れません
プログラム上のメモリリークの発生している箇所を探すには次...
// CRTメモリリーク箇所検出
_CrtSetBreakAlloc(58);
ここでは58としていますが、先ほどのメモリリークが発生して...
再度デバック起動をすると、プログラムが途中で止まります
&ref(leak.png);
この時、呼び出し履歴の欄を見てください
呼び出し履歴には関数がどの順番で呼び出されたのかの履歴が...
上から4行はmalloc関数の内部での呼び出し行を示しているの...
直接の原因となっているのはmalloc関数をプログラム上で呼び...
赤枠の行をダブルクリックします
すると、メモリリークの原因となっているmalloc関数を呼び出...
&ref(error.png);
緑の矢印が原因となっている行を指します
これでメモリリークを起こしているプログラム行の特定ができ...
ここでは単純なプログラムでしたが
ソースコードが複数ファイルある場合でも検出と箇所の特定が...
巨大なプログラムになるほどデバックは大変になりますが
この方法でメモリリークの除去は可能となるので是非有効活用...
ページ名: