Linuxは、メモリリークかどうかを検出するMTRACE / muntraceプログラムを提供します。メモリリークが発生しているコードの一部は、あなたが機能をラップするためにこれを使用することができた場合、一般的にはそれがチェックされます。それぞれが任意の非malloc関数のために、対応する自由、それはメモリリークがないことを意味し、メモリリークの問題がある場合はmallocフリー、malloc関数の各実装をMTRACE /何が起こったのか解放し、MTRACEと見つけることができません。つまり、新しいメモリのために、唯一の漏れを検出することができますが、設置することができません。したがって、Cには適用されない場合があります++
MTRACEを使用する前に、最初のテスト結果を生成MTRACEファイル名を指定するには、環境変数「MALLOC_TRACE」を設定します。このファイルには、コードがメモリリークを持っているかどうかを見ることができます。MALLOC_TRACE輸出MALLOC_TRACE = xxxはセットに使用することができる、あなたはのsetenvによって提供されてもよいです。
setenv("MALLOC_TRACE","mtrace_test_output",1);
mtrace_test_outputは店の検査結果へのファイルの名前です。しかし、試験結果のフォーマットは、平均的な人が理解することはできませんが、長いインストールMTRACEなどとして、次のコマンドを入力してシェルでPerlスクリプトをMTRACEに1つが存在します。MTRACE [バイナリ]、[ファイル]をoutput_file_nameにコンテンツがエネルギーに変換されるだろう文を理解すること。
mtrace mtrace_test mtrace_test_outpute
MTRACE / muntraceは、C関数の宣言と定義<mcheck.h>において、関数プロトタイプであります:
void mtrace(void);
void muntrace(void);
malloc関数ハンドラの類似しmalloc_hookある事実MTRACEでは、ハンドラ関数だけMTRACEシステムがあなたのためだけに書かれています。
今、私たちは、テストのMTRACEの一連の作業に来ます。
メモリ割り当て関数:malloc関数、のcalloc、reallocの、_alloca 、新しい、自由、削除を参照してください。
https://blog.csdn.net/xiaoting451292510/article/details/105094625
#include <iostream>
#include <mcheck.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
class new_delete_test
{
public:
new_delete_test() :
m_member(0x00)
{
printf("contructor\r\n");
}
~new_delete_test() {
printf("detructor\r\n");
}
private:
int m_member;
};
int main()
{
setenv("MALLOC_TRACE","mtrace_test_output",1);
mtrace();
printf("malloc & new\r\n");
void *p_malloc = malloc(100);
void *p_malloc_no_free = malloc(100);
void *p_calloc = calloc(10, 10);
void *p_calloc_no_free = calloc(10, 10);
void *p_realloc = malloc(100);
p_realloc = realloc(p_realloc, 10);
p_realloc = realloc(p_realloc, 50);
p_realloc = realloc(p_realloc, 100);
p_realloc = realloc(p_realloc, 200);
void *p_realloc_no_free = malloc(1);
p_realloc_no_free = realloc(p_realloc, 100);
int *p_new = new int;
int *p_new_no_delete = new int;
int *p_new_array = new int[100];
int *p_new_array_no_delete = new int[100];
new_delete_test *p_new_class = new new_delete_test;
new_delete_test *p_new_class_no_free = new new_delete_test;
new_delete_test *p_new_class_array = new new_delete_test[3];
new_delete_test *p_new_class_array_no_free = new new_delete_test[3];
printf("***********************************************\r\n");
printf("free & delete\r\n");
free(p_malloc);
p_malloc = NULL;
free(p_calloc);
p_calloc = NULL;
free(p_realloc_no_free);
p_realloc_no_free = NULL;
delete p_new;
p_new = NULL;
delete p_new_array;
p_new_array = NULL;
delete p_new_class;
p_new_class = NULL;
delete[] p_new_class_array;
p_new_class_array = NULL;
printf("***********************************************\r\n");
muntrace();
return 0;
}
コンパイルされたmtrace_test
g++ -Wall -g mtrace_test.cpp -o mtrace_test
ファイル名を指定して実行mtrace_test
./mtrace_test
mtrace_test_outputファイルを生成
次のコマンドを実行します。
mtrace mtrace_test mtrace_test_output
あなたはメモリリークの情報を得ることができます
メモリが解放されていない:
-----------------
アドレスサイズ発信者
0x000000000147d3b0 0x400 0x7f4ea91dc1d5で
0x000000000147d830 0x64 /home/cll/99_temp/memory_leak/mtrace/mtrace_test.cpp:26で
0x000000000147d910 0x64で/home/cll/99_temp/memory_leak/mtrace/mtrace_test.cpp:28
0x000000000147d980 0x1の/home/cll/99_temp/memory_leak/mtrace/mtrace_test.cpp:34で
0x000000000147dae0 0x4の0x7f4ea97f6c75で
0x7f4ea97f6c75で0x000000000147dca0 0x190
0x7f4ea97f6c75で0x000000000147de60 0x4の
0x000000000147dea0 0x14の時0x7f4ea97f6c75
任意の非メモリリークのmalloc /無料で何が起こった、MTRACEと見つけることができません。つまり、新しいメモリのために、唯一の漏れを検出することができますが、設置することができません。