作者QQ29 (我愛阿蓉)
看板C_and_CPP
標題[問題] 關於CRT detect memory leak
時間Wed Apr 17 16:05:32 2013
大家好
知識淺薄....
上個月看某人的程式碼 發現奇怪的東西
int tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
tmpDbgFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(tmpDbgFlag);
由於第一次看到...
原來這段code是讓程式在Terminate時 順便印出leak的區塊
例如~
Detected memory leaks!
Dumping objects ->
{148} normal block at 0x00F34E48, 4 bytes long.
Data: < > CD CD CD CD
Object dump complete.
我想問的是
{148} 意思是 第幾次malloc memory
改code
_CrtSetBreakAlloc(148) 下次再跑一次就可以設中斷點在這次
但這種東西 用在那種跟user互動阿 或是 多條thread在跑的時候
根本沒辦法確定"148"這個數值, 每次都不一樣....
我想請問各位, 有沒有招式 可以在run time get出 我這次memory alloc是第幾次
例如
int * ptr = new int;
long num = GetMemoryAllocCount();
printf("%d", num);
這樣的話我就可以輕易的在程式結束後
和printf的log做diff
看出是哪次leak了~~
不知道有沒有方法....請各位提供一些查leak的小技巧吧
謝謝
補充在問一下
他都說這是CRT了 所以說各平台C compiler都該支援這種東西嚕?
還有想問一個~~
singleton 一般會開releaseSingleton(){delete this}這種method嗎?
會這樣問是因為 若沒開 我程式結束
CRT會報說 有leak
不知道是不是要開release api給別人去release singleton
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.163.58.205
※ 編輯: QQ29 來自: 118.163.58.205 (04/17 16:21)
→ akasan:可以在 malloc 時紀錄 backtrace, 然後程式離開時印出所有 04/17 17:59
→ akasan:memory leak 跟其 back trace 出來 04/17 17:59
→ aleelyle:Visual Leak Detector可以印call stack 04/17 18:36
→ chengcti:only in microsoft Visual Studion 04/17 19:43
推 littleshan:不要用singleton 04/17 22:36
→ scwg:同意 littleshan, singleton in C++ is like hell, 如果真要 04/18 00:27
→ QQ29:請問一下為啥只有C++不建議用singleton(multi thread?) 04/18 09:56
→ QQ29:可是有些東西就真的是一個單一的service或是utility 04/18 09:57
→ QQ29:不用singleton用static method也應該是一樣的東西啊 04/18 09:57
→ QQ29:有替代方案嗎? 還是寧可做成可以多個instance也不要singleton 04/18 09:58
推 littleshan:不只是C++,scwg的連結有一篇不要用singleton的理由 04/18 15:25
推 laxw:delete singleton + multi-threads = 難解。解法參考 how to 04/18 20:50
→ laxw: kill a singleton. 04/18 20:51