Wie richtig frei / ActiveX-DLL in Delphi finalisieren?
-
05-07-2019 - |
Frage
Wir sind eine Klasse mit hier genannt ODNCServer - bei der Initialisierung ein TAutoObjectFactory
Objekt erstellt:
initialization
pAutoObjectFactory := TAutoObjectFactory.Create(ComServer, TODNCServer, Class_ODNCServer, ciSingleInstance, tmApartment);
Jetzt FastMM ist über einen Speicherverlust beschweren, da dieses Objekt nicht überall befreit. Wenn ich eine Finalisierung Anweisung wie folgt hinzufügen
finalization
if assigned(pAutoObjectFactory) then
TAutoObjectFactory(pAutoObjectFactory).Free;
dann wird das Objekt freigegeben, aber nach der FastMM Dialog über das Speicherleck erscheint, also eigentlich das O Entladen die DLL zu sein scheint, nicht das Programm. Instanzen von ODNCServer
werden wie folgt erstellt
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
));
und befreit wie folgt aus:
if ((assigned(fODNCServer)) and (fODNCServerGlobalHandle <> -1)) then
begin
Reserved := nil;
OleCheck(RevokeActiveObject(fODNCServerGlobalHandle,Reserved));
fDTRODNCServerGlobalHandle := -1;
end;
FreeAndNil(fODNCServer);
Also, weiß jemand, was ich ändern muss dieser Speicherverlust loswerden? By the way, auch ich versuchte FastMM die RegisterExpectedMemoryLeaks
mit dem Leck registrieren und zu ignorieren, aber das scheint nicht zu funktionieren. Außerdem, selbst wenn, wäre es nur eine Behelfslösung sein und ich mag den richtigen Weg wissen, dies zu tun.
Lösung
Keine Sorge darüber. Es ist kein „Leck“ im engeren Sinne. Ja, Sie erstellen ein Objekt, das nie free'd ist, aber das Schlüsselwort ist „ein“. Singular.
Ihre Anwendung / DLL nicht „Leck“ Speicher in dem Sinne, dass es zahlreiche Fälle dieser Objekte schaffen wird, es immer wieder erhöhen ist die Speichernutzung. Das Weiteren der Speicher durch dieses einzelne Factory-Objekt verwendet (und andere wie es) wird gereinigt werden, wenn der Prozess ohnehin beendet.
Wenn Sie den Code zeigen anruft verwenden RegisterExpectedMemoryLeak () könnte es möglich sein, festzustellen, warum es nicht Ihren speziellen Fall zu arbeiten.