在學習c++編寫代碼過程中,使用內置指針進行動態內存分配時,總是有意無意忘記釋放內存,但又希望自己能在控制台上輸出 內存泄露信息,
網絡上查詢到使用vld,但已經在4年前不再更新,也不支持我現在vs2019版本,雖然可以降到2015版,但終究不爽。
在microsoft 官網查文檔,可以使用如下手段進行一些粗淺提示:
檢測內存泄漏的主要工具是C/ c++調試器和C運行時庫(CRT)調試堆函數。要啟用所有的調試堆函數,請在c++程序中包含以下語句,順序如下:
#define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h>
上述技術為使用標准CRT malloc函數分配的內存識別內存泄漏。但是,如果您的程序使用c++ new操作符分配內存,那么您可能只能在內存泄漏報告中看到操作符new調用_malloc_dbg的文件名和行號。
要創建一個更有用的內存泄漏報告,你可以寫一個像下面這樣的宏來報告進行分配的行:
#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
完整代碼:
#define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> #ifdef _DEBUG #define DBG_NEW new ( _CLIENT_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 int main() { try { int* i = DBG_NEW int();//需要使用DEG_NEW 暫時替代new 作為跟蹤,需要debug調試模式下才起作用, 發布版本應該任然使用 new,這里只是一個例子 } catch (runtime_error err) { cout << err.what(); } _CrtDumpMemoryLeaks();//打印釋放內存報告 }
輸出顯示:
在源文件第58行 ,位置0x008F9598 , int 4字節整形,低4位都是十六進制00,動態內存沒有安全釋放。
如果是使用了delete 或者 智能指針,就不會出現這一行數據。這樣測試往往 是把打印放在函數外面,一般是{} 結束之后,不要放在函數里面測試,
不然得到的永遠是泄露泄露!
后面兩行normal block 應該是程序正常輸出提示。
2021-04-05 記:
看了下樓價,依然高聳,我默默放下手機,朋友圈經常曬酒吧喝酒的女孩依然不怎么理我,或許這會正躺在哪張床上 ,我覺得我依然還有動力,干他娘這個世界。