爲了尋找內存泄漏,我一直在使用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)。
那麼,這是什麼意思?
[爲什麼在應用程序的第一行代碼執行之前調用TObject.Free?](http://stackoverflow.com/questions/5331783/why-tobject-free-is-called-before我的應用程序的第一行代碼是exe) – 2011-03-17 15:34:13
VirtualAlloc是一個調用來從系統分配內存的函數。如果您停止調用VirtualAlloc,則不會泄漏內存。你也無法做動態分配。不是很有用。我簡直不明白爲什麼你不會使用這個工具來告訴你你的漏洞在哪裏。 – 2011-03-17 15:45:45
David在我的源文件VirtualAlloc被調用的地方沒有。該程序不直接調用VirtualAlloc。它被隱含地稱爲。順便說一句,我會在我以前的問題中提出這個問題,雖然它與這個問題有關,但它是不一樣的。我具體詢問VirtualAlloc。 – ThN 2011-03-17 16:35:48