2014-12-27 48 views
0

初學者到C++。Visual C++,MFC應用程序,No Malloc等等:什麼會導致內存泄漏?

我花了8個多小時試圖在這裏找到Google幫助。

(補充說明:我安裝了PurifyPlus的試用版,但由於某種原因,我的應用程序不能運行「內部」)。

我有一個持久性內存泄漏的MFC應用程序。

有一系列的線程作爲:DWORD WINAPI WorkThread(LPVOID LPARAM) 其中的每一個調用線程爲:空隙TradeLogic(CIBTraderDlg * PDLG) 上的計時器。

有一個對話框,其中包含ListView控件。

應用程序中的任何地方都沒有「malloc」或「calloc」調用。 (搜索包括完整的API) 有一個「新」套接字只在程序啓動時執行一次。 「新」沒有動態分配。 當程序啓動時,只有一次文件讀取一次。

但是仍然存在內存泄漏,無限無盡。 (每15秒大約4K字節,儘管不完全一致)

我的程序沒有在調試模式下完全運行。該對話框出現了,但它不會執行任何對遠程服務器時間的調用,因此不會執行關閉此事件的事件(包括更新列表視圖)。

儘管如此,在「Debug」運行如此合格,當我點擊我的「退出」按鈕時,Debug輸出顯示了CRT文件中的消息,但它們並沒有明顯的幫助,因爲根本沒有發生泄漏(他們建議套接字的「新」可能會泄漏,但同樣,套接字只能打開一次)。 Taskmgr確認此限制模式下不發生泄漏。

於是,我跟着MSDN和「退出」順序嘗試下面的代碼:

HANDLE hLogFile; 
hLogFile = CreateFile("c:\\log.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); 
_CrtSetReportFile(_CRT_ERROR, hLogFile); 

_RPT0(_CRT_ERROR,"file message\n"); 
_CrtDumpMemoryLeaks(); 
CloseHandle(hLogFile); 
exit(0); 

並正常運行該程序。但是當我點擊退出時,我只會得到CRT的輸出全部無法檢測的文本「文件信息」。

有人可以指向我可能在代碼中尋找問題的位置嗎?

+0

你有指針,智能指針,線程嗎?你不能使用內存泄漏檢測器(Purify,Valgrind,...) – 2014-12-27 19:11:50

+0

我下載了Purify,但由於某種原因,我的應用程序不能運行。 – cjv 2014-12-27 19:16:55

+0

順便說一句,如果你可以編寫你的Linux應用程序(例如使用[Qt](http://qt-project.org/)...也可以在Windows上編譯),這可能會更簡單 - 因爲Linux有很多的工具來幫助解決這個問題。 – 2014-12-27 19:18:44

回答

0

您可以嘗試使用此庫輕鬆檢測泄漏,但我猜測問題是Windows正在分配內存,因此這無濟於事。

https://vld.codeplex.com/

下,只有一個工作線程測試您的應用程序,以確保你沒有競爭條件。如果它只適用於單個工作線程,那麼你就有多線程問題。

如果使用單個線程進行測試並沒有幫助,那麼直接調試問題的方法是註釋掉應用程序的某個部分(例如執行處理的函數調用),運行應用程序,查看是否它仍然泄漏,並重復,直到你縮小問題。我將首先評論所有與ListView的交互。

如果您嘗試從多個線程更新ListView,那麼您將遇到麻煩。像ListView這樣的Windows控件只能在主線程中運行,所以所有的工作線程都會阻塞更新ListView。