[英]How to correctly free/finalize an ActiveX DLL in Delphi?
我們在這里使用一個稱為ODNCServer的類-在初始化時,將創建一個TAutoObjectFactory
對象:
initialization
pAutoObjectFactory := TAutoObjectFactory.Create(ComServer, TODNCServer, Class_ODNCServer, ciSingleInstance, tmApartment);
現在, FastMM抱怨內存泄漏,因為此對象沒有在任何地方釋放。 如果我添加這樣的終結聲明
finalization
if assigned(pAutoObjectFactory) then
TAutoObjectFactory(pAutoObjectFactory).Free;
然后釋放該對象,但是在彈出有關內存泄漏的FastMM對話框后,實際上,操作系統似乎正在卸載DLL,而不是程序。 ODNCServer
實例是ODNCServer
創建的
fODNCServer := TODNCServer.Create(nil);
//register into ROT
OleCheck(
RegisterActiveObject(
fODNCServer.DefaultInterface, // instance
CLASS_ODNCServer, // class ID
ACTIVEOBJECT_STRONG, //strong registration flag
fODNCServerGlobalHandle //registration handle result
));
並像這樣釋放:
if ((assigned(fODNCServer)) and (fODNCServerGlobalHandle <> -1)) then
begin
Reserved := nil;
OleCheck(RevokeActiveObject(fODNCServerGlobalHandle,Reserved));
fDTRODNCServerGlobalHandle := -1;
end;
FreeAndNil(fODNCServer);
那么,有人知道我必須做些什么來擺脫內存泄漏嗎? 順便說一句,我還嘗試使用FastMM的RegisterExpectedMemoryLeaks
注冊並忽略泄漏,但這似乎不起作用。 此外,即使這只是一種解決方法,我也想知道正確的方法。
不用擔心 從嚴格意義上講,這不是“泄漏”。 是的,您正在創建一個永不釋放的對象,但是關鍵字為“ an”。 單數。
您的應用程序/ DLL不會“泄漏”內存,因為它將創建這些對象的大量實例,並不斷增加其內存使用量。 此外,當進程終止時,該單個工廠對象(以及其他類似對象)使用的內存將被清除。
如果顯示了用於調用RegisterExpectedMemoryLeak()的代碼,則可能可以確定為什么它在您的特定情況下不起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.