2017-08-09 107 views
0

我使用Visual 2017年寫一個MFC應用程序應用程序退出時在調試模式下,我得到這個:檢測內存泄漏

檢測內存泄漏!轉儲對象 - > {74}正常塊在 0x00000230E49A7000,長度爲16個字節。數據:< 0 0> 30 00 97 E4 30 02 00 00 00 00 00 00 00 00 00對象轉儲完成。

因此,爲了知道哪些功能是造成泄漏,我已在stdafx.h中這些行:

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

而且這些線路中的CWinApp :: InitInstance中():

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
_CrtSetBreakAlloc(74); 

雖然它沒有工作。我懷疑第74個內存分配號碼是在我的代碼執行之前完成的。我可以重載哪種方法以確保首先被調用?

+0

它總是74嗎? – drescherjm

+0

是的,它總是74.我發現內存泄漏發生在我導入到我的項目中的非MFC代碼中。雖然,我猜_CrtSetDbgFlag不會在此代碼執行之前調用。 –

+0

我將這些行放在外部代碼主類的構造函數中,並且調試器在堆棧(而不是堆)上分配std :: vector時停止。很奇怪...... –

回答

2

步入你的應用程序開始調試(這是一步,不運行,所以你會在程序中的任何內容運行之前停止在調試器中),然後將_crtBreakAlloc設置爲你想要停止的分配(74) 。然後運行,你應該在第74次分配中休息一下。 CRT Debug Heap Details有關於這個變量的信息。

+0

我做到了,但調試器在程序結束之前沒有中斷。但是我想知道一些事情:因爲我在CWinApp :: InitInstance()中調用了_CrtSetDbgFlag,堆檢測已經被激活得太晚了,你不覺得嗎? –

+0

@MarkMorrisson正確。當您調用_CrtSetBreakAlloc時,或者第74次分配已經發生,或者您的程序永遠不會達到第74次分配。 – 1201ProgramAlarm

+0

那麼,我能做什麼? –

0

編寫這些代碼

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 
在每個實現(.CPP)文件的頂部

,可以幫助您檢測內存泄漏的根源。 另請參閱:How to detect memory leaks in MFC

+0

因爲我在我的項目中包含很多外部文件,所以我在stdafx.h(通常包含在每個源文件中)的末尾添加了這些行,但效果並不理想。 –