2011-12-17 174 views
9

在我的wxWidgets應用程序中,在調試模式下運行時,我在Visual Studio 2010的輸出中收到了此消息。應用程序運行正常,我在關閉它後纔看到此消息。檢測到的內存泄漏

檢測到內存泄漏!

傾倒對象 - >

{9554}在0x003CDCC0正常塊,44個字節長。
數據:<簡d> 20 C1 65 01 01 00 00 00 6E 00 00 00 9C 64 CE 01

{9553}在0x003CDB58正常塊,8個字節長。

數據:< dé<> 44 BD 65 01 C0 DC 3C 00
{9552}在正常0x003CDC50,48個字節長塊。

數據:< E> A0 95 65 01 01 00 00 00 19 00 00 00 19 00 00 00

對象轉儲完成。

在我的程序中,我沒有明確分配內存,但是wxWidgets框架是。我第一次得到這樣的信息,並不知道它的確切原因。

我該如何擺脫這種內存泄漏?

+1

發佈您的代碼,最好是最小的程序這再現了這個問題。 – user1071136 2011-12-17 11:14:27

+0

不幸的是我不能發佈一個最小的程序。因爲它是一個包含多個文件的GUI程序,還有一個GUI框架。我不知道是什麼導致了這一點。因爲我沒有使用`new`或`malloc`。 – 2011-12-17 11:22:16

+0

我只是怕你會得到更多的猜測比答案:) – user1071136 2011-12-17 11:56:10

回答

24

您只需在主函數的開頭添加以下行。添加這個標誌,Visual Studio將會破壞創建內存泄漏的那一行。

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    _CrtSetBreakAlloc(9554); 
    _CrtSetBreakAlloc(9553); 
    _CrtSetBreakAlloc(9552); 

請確保您有正確的對象正常塊地址,因爲他們可能會改變,並確保您在_DEBUG編譯。

另請參閱:_CrtSetDbgFlag_CrtSetBreakAlloc MSDN參考。

0

也許某些靜態實例仍然由框架分配。試着用像「devpartner」這樣的profiler解決它。

+0

可以從視覺工作室的消息用於獲得一些幫助? – 2011-12-17 11:10:49

0
  1. 不要只是'假設'你的代碼是內存泄漏證明。除非你是編程的半神之一,否則沒有人可以避免寫內存泄漏。

  2. 您可以使用像邊界檢查器(來自Microfocus)的工具來幫助識別內存泄漏,因爲它會給你一個調用堆棧。從調試CRT獲得的內存泄漏報告只是告訴你在特定地址泄漏的內存。像邊界檢查器這樣的產品會給你一個內存泄漏的調用堆棧,以及許多其他的好東西。市場上還有其他內存泄漏工具,但我不會在這裏列出它們。

  3. 如果你確定內存泄漏是由於'wxWidgets'造成的,那麼也許你應該通知該庫的編寫者,他們可能會修復它(通過適當的repro步驟)。

0

This wiki建議增加以下內容你有充分的源文件,畢竟其他頭包括的:

#ifdef __WXMSW__ 
    #include <wx/msw/msvcrt.h>  // redefines the new() operator 
#endif 

這將導致泄漏您的程序結束時被報告。

更具體地說,請確保您使用new(除了可能是您的頂部窗口)創建的所有對象上都調用->Destroy()

0

如果用vs報告泄漏的位置是相同的每一個你可以設置一個databreakpoint看到時候該存儲器正在改變,希望找出是誰分配此內存