溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

VS中捕獲內(nèi)存泄露

發(fā)布時(shí)間:2020-07-03 05:54:21 來(lái)源:網(wǎng)絡(luò) 閱讀:897 作者:杰思 欄目:開(kāi)發(fā)技術(shù)

VS中捕獲內(nèi)存泄露

內(nèi)存泄露十分討厭,捕獲內(nèi)存泄露更加令人厭煩……

其實(shí),VS本身就有內(nèi)存泄露的檢測(cè)機(jī)制。只需做以下操作即可開(kāi)啟。(同時(shí)必須在debug模式 下運(yùn)行程序并且以 正常流程退出 )

  1. // 在入口函數(shù)cpp中添加以下定義和頭文件   

  2. #define CRTDBG_MAP_ALLOC   

  3. #include <stdlib.h>   

  4. #include <crtdbg.h>   

  5. // 在入口函數(shù)一開(kāi)始添加以下代碼   

  6. _CrtDumpMemoryLeaks();  

  7.     _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );  

  8. // 在入口函數(shù)cpp中添加以下定義和頭文件  

  9. #define CRTDBG_MAP_ALLOC  

  10. #include <stdlib.h>  

  11. #include <crtdbg.h>  

  12. // 在入口函數(shù)一開(kāi)始添加以下代碼  

  13. _CrtDumpMemoryLeaks();  

  14.     _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );   

然后在以 正常流程退出 程序后, 就會(huì)在輸出窗口顯示出內(nèi)存泄露的信息了。

注意!重點(diǎn)來(lái)了。

雖然VS檢測(cè)出來(lái)了哪里有了內(nèi)存泄露, 但是有可能你得到的有效信息只有兩個(gè) (如下)

1. 未釋放的內(nèi)存大小。(綠色部分 )

2. 這塊內(nèi)存是程序中總計(jì)第幾個(gè)被申請(qǐng)的。(藍(lán)色部分 )。

3. 而申請(qǐng)空間所在代碼的位置可能不會(huì)被顯示(刪除線部分 )。

Detected memory leaks! Dumping objects -> C:/PROGRAM FILES/VISUAL STUDIO/MyProjects/leaktest/leaktest.cpp(20) : {18 } 
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

那么, 如果出現(xiàn)了這種情況, 其實(shí)是根本無(wú)法知道哪里出了問(wèn)題。那么這個(gè)時(shí)候該怎么辦呢?

這個(gè)時(shí)候需要使用這個(gè)函數(shù)。

 

  1. //num就是剛剛檢測(cè)出來(lái)的內(nèi)存泄露的地方大括號(hào)內(nèi)的數(shù)字   

  2. _CrtSetBreakAlloc(num);  

  3. //num就是剛剛檢測(cè)出來(lái)的內(nèi)存泄露的地方大括號(hào)內(nèi)的數(shù)字  

  4. _CrtSetBreakAlloc(num);  


這個(gè)函數(shù)的作用是,在你運(yùn)行程序的時(shí)候,會(huì)在第num次申請(qǐng)空間時(shí)斷點(diǎn)。

所以,你需要重新運(yùn)行一遍程序 。(只要流程一樣,內(nèi)存申請(qǐng)順序肯定是一樣的,所以會(huì)正確的在需要的地方斷掉。)

注意,之前提示的內(nèi)存泄露中大括號(hào)內(nèi)的數(shù)值就是指的第幾次申請(qǐng)的空間泄露了。

這個(gè)時(shí)候查看堆棧調(diào)用 ,即可知道到底是在哪里申請(qǐng)了內(nèi)存但是忘記釋放掉了。然后將這塊內(nèi)存在合適的時(shí)候釋放掉就行了。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI