**於:
通過封裝malloc函式來實現, 拋磚引玉, 哪位大俠有更好的方法可以拿出來一起分享一下吧~~
原理:原來系統中可能存在大量的malloc分配記憶體的地方, 通過封裝後可以記錄下呼叫malloc的檔名和行數. 分配記憶體的時候把分配到的記憶體首位址放到鍊錶中. 如果這段記憶體被釋放再從鍊錶中拿出來. 這樣可以通過列印鍊錶內容發現所有未釋放的記憶體. 可以通過比較兩個時間段的鍊錶內容來判斷哪些內存在偷偷地洩露, 應該還是比較明顯滴... 缺點就是要額外分配空間儲存鍊錶. 如果有shell直接列印,如果沒有shell就寫檔案吧...
用vc6.0環境
先在標頭檔案stdafx.h中定義巨集
#define malloc(size) malloc_ext(size,__file__, __line__)
#define free(p) free_ext(p,__file__, __line__)
void * malloc_ext(size_t size,const char *name, unsigned int line);
void free_ext(void * p,const char *name, unsigned int line);
函式宣告
struct record * add_record(struct record *head, unsigned int addr, unsigned int line, const char *name);
int delete_record(struct record *head, unsigned int addr);
void show_record(void);
單向鍊錶結構
/*檔案路徑名長度,可以根據需要修改*/
#define patch_len 50
struct record
;stdafx.cpp檔案中
先undef掉自己定義的巨集
/*在此檔案中去掉malloc的巨集定義,使用系統提供的malloc函式*/
#ifdef malloc
#undef malloc
#endif
#ifdef free
#undef free
#endif
再重新包含系統的標頭檔案
#include "malloc.h", 這樣下面**中用的就是系統的malloc free函式了
/*定義未釋放記憶體煉表頭節點*/
struct record* record_list = 0;
void * malloc_ext(size_t size,const char *name,unsigned int line)
return p;
}void free_ext(void * p,const char *name, unsigned int line)
delete_record(record_list, (unsigned int)p);
free(p);
}record * add_record(struct record *head, unsigned int addr, unsigned int line, const char *name)
m = head;
while(m->next != null)
n = (struct record*)malloc(sizeof(struct record));
n->addr = addr;
n->line = line;
memcpy(n->name, name, patch_len);
n->name[patch_len] = \'\\0\';
n->next = null;
m->next = n;
m = n;
return head;
}int delete_record(struct record *head, unsigned int addr)
m = n = head;
if(head->next == null)
return 1;
}n = m->next;
while(n != null)
m = m->next;
n = n->next;
}return 1;
}/*根據各自的系統列印未釋放記憶體鍊錶內容,或者寫入檔案*/
void show_record(void)
p = head;
printf("memory list without free:\\n");
while(p != null)
}測試**在附件中了, 沒有實際移植到嵌入式系統跑過.
C 程式檢測記憶體洩露
1 用debugview,開啟debugview,執行你的debug版本程式,可以定位到原始檔的某一行。2 包含stdlib.h crtdbg.h 兩個標頭檔案 在程式開始處新增 define crtdbg map alloc 在程式結束處新增 crtdumpmemoryleaks 比如 defin...
記憶體洩露檢測
c 中檢測記憶體洩漏可以引入系統定義的巨集來檢視,內存在哪個位置洩漏 檔案開始處加入下列定義 define crtdbg map alloc include include 程式退出時加入以下函式 crtdumpmemoryleaks 如果有洩漏會顯示 記憶體洩漏是程式設計中常常見到的乙個問題,我所...
檢測記憶體洩露
程式結束時,作業系統會 程式占用的資源.但是,只要程式還在執行,如果不進行清理,資源最終可能被耗盡.1.vc記憶體洩露檢查工具 visual leak detector 現在已知的最新有2.0版本的,使方法不詳。使用 visual leak detector 2.2.3 在vs工程的linker i...