2011-03-17 91 views
2

爲了尋找內存泄漏,我一直在使用MemProof,並能夠看到正在使用,創建和銷燬的資源的實時計數。在運行我的程序超過一天半之後,我注意到其他一切都在恆定或更少,虛擬內存(VM)的數量正在增加。它從109開始,現在在24小時後達到113。爲什麼我的程序泄漏虛擬內存?

這就是說MemProof爲每個VM泄漏:

的VirtualAlloc(address_location,16384,4096,4);它被識別爲虛擬內存,其大小始終爲16384. API名稱爲VirtualAlloc。該模塊是kernel32.dll。此外,memproof說:「virtualalloc在調用進程的虛擬地址空間中保留或提交頁面區域,分配的頁面必須在不再需要時使用virtualFree釋放。」

VM泄漏與文件System.Pas中的函數關聯。

的功能如下:

function GetCmdShow: Integer; 
var 
    SI: TStartupInfo; 
begin 
    Result := 10;     { SW_SHOWDEFAULT } 
    GetStartupInfo(SI); 
    if SI.dwFlags and 1 <> 0 then { STARTF_USESHOWWINDOW } 
    Result := SI.wShowWindow; 
end; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

我比在關鍵詞「結束」指向標誌少就是Memproof需要我時,我點擊虛擬內存泄漏(S)。

那麼,這是什麼意思?

+0

[爲什麼在應用程序的第一行代碼執行之前調用TObject.Free?](http://stackoverflow.com/questions/5331783/why-tobject-free-is-called-before我的應用程序的第一行代碼是exe) – 2011-03-17 15:34:13

+1

VirtualAlloc是一個調用來從系統分配內存的函數。如果您停止調用VirtualAlloc,則不會泄漏內存。你也無法做動態分配。不是很有用。我簡直不明白爲什麼你不會使用這個工具來告訴你你的漏洞在哪裏。 – 2011-03-17 15:45:45

+0

David在我的源文件VirtualAlloc被調用的地方沒有。該程序不直接調用VirtualAlloc。它被隱含地稱爲。順便說一句,我會在我以前的問題中提出這個問題,雖然它與這個問題有關,但它是不一樣的。我具體詢問VirtualAlloc。 – ThN 2011-03-17 16:35:48

回答

5

德爾福的FastMM內存管理器工作在Windows內存系統之上。它使用VirtualAlloc從操作系統分配大塊內存,然後將其分成更小的塊,供程序使用。如果你釋放了大量的內存,它會將一些內存回給操作系統。但是,如果你釋放少量的內存,它很可能會持續下去,因爲你可能很快就會需要它。這是FastMM速度的一部分,它不是內存泄漏。

任何只監視VirtualAlloc並且實際上沒有注意到FastMM正在做什麼的內存分析器都會給你帶來不合理的結果。正如David在評論中提到的,如果你想追蹤真實內存泄漏,你需要使用FastMM工具。從SourceForge下載FastMM的完整版本並閱讀文檔以瞭解如何啓用FullDebugMode以及泄漏報告和日誌記錄,並且您將有更容易的時間。

+0

好的。我去做。我樂於接受建議。謝謝。 – ThN 2011-03-17 16:38:47

+0

+1感謝您的支持! – 2011-03-17 16:59:56

+0

@David和@Mason FastMM4絕對需要一些習慣,因爲它的用戶界面(日誌文件)非常神祕而且有點嚇人(如果我可以這麼說)。但是,在運行我的軟件後,我花了一些時間瀏覽日誌文件,並在源文件中發現各種泄漏。其中一些顯而易見但被忽視。謝謝你的幫助。 – ThN 2011-03-17 20:36:57