看板 C_and_CPP 關於我們 聯絡資訊
大家好 知識淺薄.... 上個月看某人的程式碼 發現奇怪的東西 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
scwg: http://0rz.tw/IbouU 或去念 (應該是) Modern C++ Design 04/18 00:28
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
littleshan: http://bit.ly/cQWWmd 04/18 15:26
laxw:delete singleton + multi-threads = 難解。解法參考 how to 04/18 20:50
laxw: kill a singleton. 04/18 20:51