記憶體洩露的檢測小程式

2022-04-16 11:07:12 字數 2306 閱讀 2371

**於:

通過封裝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...