2012-04-19 82 views
3

我的應用程序使用加載網頁的TWebBrowser。問題是,在關閉包含TWebBrowser的表單後,所使用的內存不會被釋放。如果我打開和關閉表單,內存會不斷增加。Delphi TWebBrowser內存泄漏

看了一些關於調用SetProcessWorkingSetSize()或CoFreeUnusedLibrariesEx()來解決這個問題的帖子,但我不確定這些是否是正確的解決方案。

任何想法如何釋放TWebBrowser使用的內存?

+6

我想你可能會誤解你正在用來收集這些統計數據的任何內容。堆分配器非常複雜,它們持續記憶直到需要釋放它爲止是非常普遍的。如果系統有足夠的可用內存,爲什麼花費時間將其返回到操作系統時,您可以免費使用它。 – 2012-04-19 09:04:38

+1

你如何關閉(並打開)表單,並且它是否被任何東西釋放?來源請。 – mj2008 2012-04-19 09:57:38

+0

如果您在不加載網頁的情況下打開和關閉表單,是否仍然存在內存問題? – 2012-04-19 16:45:31

回答

1

使用TWebBrowser在幕後進行了大量工作,完成了大量與Internet Explorer完全相同的工作。它對你來說是隱藏的,但它仍然存在,我們有可能無法從內存中強制刪除它。檢查頁面加載之前和之間的內存使用情況,並測試在調用Navigate('about:blank');時會發生什麼情況。還要檢查你的析構函數是否被正確調用,並考慮從OnClose或OnCloseQuery調用Navigate('about:blank');。我發現這確實有助於記憶狀況。

-1

要釋放內存,只是初始化新的文件:

(WebBrowser.Document as IPersistStreamInit).InitNew; 
+0

該解決方案無效,內存不斷增加。 – delphirules 2015-02-05 23:16:21

-1
procedure TForm1.FreeMemory; 
begin 
    if Win32Platform = VER_PLATFORM_WIN32_NT then 
    SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF); 
end; 

,並從時間調用它來時間

FreeMemory; 
+0

此解決方案不起作用;它只是「壓縮」使用的內存,但在重新定位之前使用的所有巨大內存之後重新導航。 – delphirules 2015-02-05 21:13:49

3

QC#106829描述了TWebBrowser內存泄漏的一個可能的原因。訪問Document(以及通過TOleControl.GetIDispatchPropTOleControl.GetIUnknownProp實現的任何其他屬性)會導致泄漏,因爲它調用AddRef時未曾調用Release。作爲解決方法,您可以手動調用Release,也可以修補VCL(see here),或者避免出現問題的屬性(例如,使用browser.DefaultInterface.Document代替browser.Document)。

+0

使用'browser.DefaultInterface.Document'而不是'browser.Document'解決了我的內存泄漏問題。謝謝 – chadkops 2016-09-19 14:45:27