日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用CRT查找内存泄漏

發布時間:2025/3/21 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用CRT查找内存泄漏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引用原文地址

https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

?

1. 在program中嚴格按下面順序include

1 #define _CRTDBG_MAP_ALLOC 2 #include <stdlib.h> 3 #include <crtdbg.h>

?

2. 必須是Debug版的build

Q : LiteServer遍Debug可能會遇到一些問題

A : 可以用來驗證Memcheck是否有誤報。

??? 可以在對應的地址處下斷點(會頻繁斷在malloc上,需要根據size下條件斷點)

Q : code在Release和Debug版下可能會不一樣,最后可能會出現一個有memory leak一個沒有

?

3. "#define _CRTDBG_MAP_ALLOC"這個宏不能省略,否則memory leak的dump會缺少一些細節(如leak的code位置信息)

?

4. 在app exit前,可以調用這個function打印memory leak report

_CrtDumpMemoryLeaks();

Q : 如果是全局或靜態obj,在exit前其還未釋放,此時report不會造成誤報嗎?

A :不會

?

5. 如果app有多個exits,你是不需要call _CrtDumpMemoryLeaks()在每個exit位置的。在app開始的位置call下面這個_CrtSetDbgFlag(),其會自動在每個exit的位置自動call _CrtDumpMemoryLeaks()

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

?

6. 默認情況下,memory leak的report會在VS Studio Debug窗的Output窗口中,可以用_CrtSetReportMode()將其重定向到其他位置。

?

7. Report格式

Detected memory leaks!Dumping objects ->c:\users\username\documents\projects\leaktest\leaktest.cpp(20) : {18} //{18} : memory分配序號 normal block at 0x00780E80, 64 bytes long. //64 bytes : block的大小(并不是分配時指定的大小,因為分配的heap由于會添加堆頭堆尾等額外信息,會比分配時指定的size要大) Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CDObject dump complete. ?

Q : 發現即使按照第一條中的定義,也不會輸出memory leak的行信息。

A : 這個crtdbg對new處理不好,其block的地址只會new調用macro的地址,可用如下宏DBG_NEW來替代new,以打印出對應的行信息

#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 : 需要替換所有的源碼,而且第三方庫怎么辦?

Q : 沒有棧回溯信息,多層調用怎么查找源頭信息?

A :? Debug,在app入口斷下后,在watch窗口輸入"_crtBreakAlloc"(如果"Runtime Library"是"/MD",則還需要添加"{,,ucrtbased.dll}_crtBreakAlloc"),這個值應該是"-1",修改成detect到的memory leak的分配序號(如7中的{18}),當分配該大小的memory時就會斷下來(注意,重跑后的條件要和第一次獲取分配序號的一致)。

??? 另外,在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出來的memory leak,可見并不會報出對應的code的行號

轉載于:https://www.cnblogs.com/organic/p/7868153.html

總結

以上是生活随笔為你收集整理的用CRT查找内存泄漏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。