用CRT查找内存泄漏
引用原文地址 :
https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx
?
1. 在program中嚴(yán)格按下面順序include
1 #define _CRTDBG_MAP_ALLOC 2 #include <stdlib.h> 3 #include <crtdbg.h>?
2. 必須是Debug版的build
Q : LiteServer遍Debug可能會(huì)遇到一些問(wèn)題
A : 可以用來(lái)驗(yàn)證Memcheck是否有誤報(bào)。
??? 可以在對(duì)應(yīng)的地址處下斷點(diǎn)(會(huì)頻繁斷在malloc上,需要根據(jù)size下條件斷點(diǎn))
Q : code在Release和Debug版下可能會(huì)不一樣,最后可能會(huì)出現(xiàn)一個(gè)有memory leak一個(gè)沒(méi)有
?
3. "#define _CRTDBG_MAP_ALLOC"這個(gè)宏不能省略,否則memory leak的dump會(huì)缺少一些細(xì)節(jié)(如leak的code位置信息)
?
4. 在app exit前,可以調(diào)用這個(gè)function打印memory leak report
_CrtDumpMemoryLeaks();
Q : 如果是全局或靜態(tài)obj,在exit前其還未釋放,此時(shí)report不會(huì)造成誤報(bào)嗎?
A :不會(huì)
?
5. 如果app有多個(gè)exits,你是不需要call _CrtDumpMemoryLeaks()在每個(gè)exit位置的。在app開始的位置call下面這個(gè)_CrtSetDbgFlag(),其會(huì)自動(dòng)在每個(gè)exit的位置自動(dòng)call _CrtDumpMemoryLeaks()
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
?
6. 默認(rèn)情況下,memory leak的report會(huì)在VS Studio Debug窗的Output窗口中,可以用_CrtSetReportMode()將其重定向到其他位置。
?
7. Report格式
Detected memory leaks!Dumping objects ->c:\users\username\documents\projects\leaktest\leaktest.cpp(20) : {18} //{18} : memory分配序號(hào) normal block at 0x00780E80, 64 bytes long. //64 bytes : block的大小(并不是分配時(shí)指定的大小,因?yàn)榉峙涞膆eap由于會(huì)添加堆頭堆尾等額外信息,會(huì)比分配時(shí)指定的size要大) Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CDObject dump complete. ?Q : 發(fā)現(xiàn)即使按照第一條中的定義,也不會(huì)輸出memory leak的行信息。
A : 這個(gè)crtdbg對(duì)new處理不好,其block的地址只會(huì)new調(diào)用macro的地址,可用如下宏DBG_NEW來(lái)替代new,以打印出對(duì)應(yīng)的行信息
#ifdef _DEBUG#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )// Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the // allocations to be of _CLIENT_BLOCK type #else#define DBG_NEW new#endif?
Q : 需要替換所有的源碼,而且第三方庫(kù)怎么辦?
Q : 沒(méi)有棧回溯信息,多層調(diào)用怎么查找源頭信息?
A :? Debug,在app入口斷下后,在watch窗口輸入"_crtBreakAlloc"(如果"Runtime Library"是"/MD",則還需要添加"{,,ucrtbased.dll}_crtBreakAlloc"),這個(gè)值應(yīng)該是"-1",修改成detect到的memory leak的分配序號(hào)(如7中的{18}),當(dāng)分配該大小的memory時(shí)就會(huì)斷下來(lái)(注意,重跑后的條件要和第一次獲取分配序號(hào)的一致)。
??? 另外,在code中也可以直接指定:
_crtBreakAlloc = 18;or :_CrtSetBreakAlloc(18);?
8. Test
1> code
#include <memory>std ::tr1 ::shared_ptr <int > sp_nTest;void Test () {sp_nTest. reset( new int( 0x88));//memory leakint* pnTest = new int( 0xCC);void* pMalloc = malloc( sizeof( int)); }?
2> result
Detected memory leaks!Dumping objects ->d:\codes\vs2010\test\detectmemleak\console\test.cpp(14) : {65} normal block at 0x007B18A8, 4 bytes long.Data: < > CD CD CD CD {64} normal block at 0x007B4F90, 4 bytes long. Data: < > CC 00 00 00Object dump complete.紅色部分是new出來(lái)的memory leak,可見并不會(huì)報(bào)出對(duì)應(yīng)的code的行號(hào)
轉(zhuǎn)載于:https://www.cnblogs.com/organic/p/7868153.html
總結(jié)
以上是生活随笔為你收集整理的用CRT查找内存泄漏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据分析(排序,数据特征、平均数、方差等
- 下一篇: 使用 Visual Studio Tea