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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top