調試C++代碼內存釋放,在VS2019控制台顯示內存泄露


   在學習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 記:

  看了下樓價,依然高聳,我默默放下手機,朋友圈經常曬酒吧喝酒的女孩依然不怎么理我,或許這會正躺在哪張床上 ,我覺得我依然還有動力,干他娘這個世界。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM