Thema: Delphi hängende Interfaces

Einzelnen Beitrag anzeigen

Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#1

hängende Interfaces

  Alt 29. Jan 2016, 15:33
Ich kann das Problem erst mal nur allgemein beschreiben.
Vielleicht kann ja dennoch jemand etwas dazu sagen...

Ich habe eine Factory, die mir diverse Objekte erzeugt und als Interfaces heraus gibt.
Jede Klasse unterstützt idR mehrere Interfaces und die Unterstützung prüfe ich mit Supports().

Jetzt benötige ich aber diverse gegenseitige Referenzierungen und Eintragungen in diversen Listen.

EurekaLog zeigt mir entsprechend auch MemoryLeaks an, da die Objekte NATÜRLICH nicht aufgelöst werden.

ABER wiederum zeigt mit EurekaLog nur einzelne Objekte an, nicht aber die 1000 erzeugten Objekte von TMyClass, obwohl deren Destructoren aber definitiv nie durchlaufen wurden.


Ich habe daher drei grundsätzliche Fragen:

- Gibt es so von der Ferne eine Erklärung, warum EurekaLog meine 1000 Objekte nicht bemeckert, obwohl die definitiv nicht aufgelöst wurden?

- Gibt es eine Möglichkeit die "hängenden Referenzen" herauszufinden? Mir würde nur einfallen, das Projekt zu entkernen und Stück für Stück neu zusammen zu setzen und zu profilen.

- Inzwischen denke ich, dass die automatische Referenzzählung für mich doch nicht so sinnvoll ist. Interfaces möchte ich zwar wegen der austauschbaren Funktionalitäten und einheitlicher öffentlicher Schnittstellen weiter nutzen, aber die Lebenszeit und gegenseitige Referenzen würde ich doch lieber wieder selbst verwalten.

Den Themenkomplex hatten wir schon mal behandelt.
http://www.delphipraxis.net/166899-i...eferenzen.html
http://www.delphipraxis.net/159095-r...objekte-2.html

Ich werde jetzt mal in Richtung von Bummis Vorschlag überlegen: http://www.delphipraxis.net/1134394-post46.html.
Dann erzeugt die Factory auf Anforderung bestimmte Objekte und verwaltet auch deren Lebenszeit und die Freigabe.
Referenzen werden dann über eine ID zugewiesen. Wenn benötigt wird ein entsprechendes Interface anhand der ID abgerufen und nach Verwendung beim rauslaufen aus dem Scope wieder Counter-Reduziert.
Wenn das Abrufen über ein Dictionary oder binäre Liste läuft wäre das ja auch performant.

Dann gäbe es halt nicht so etwas wie
Delphi-Quellcode:
TPerson.NameDesVaters: string
begin
  Result := Vater.Name;
end;
sondern
Delphi-Quellcode:
TPerson.NameDesVaters: string
var
  Vater: IPerson;
begin
  // TPerson kennt nur eine "VaterId"
  Vater := TFactory.GetPerson(VaterId); // Wird aus dem Dict geholt bzw. ggf. zuvor wenn nötig instanziiert
  Result := Vater.Name;
end;
// Referenz auf Vater ist wieder aufgelöst

Die Interface-Objekte werden freigegeben, wenn die Factory diese aus ihrer Sammlung entfernt.

Wenn ich das so umsetzen kann sind die ersten beiden Fragen zwar im Grunde hinfällig, aber dennoch würden mich Antworten interessieren.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (29. Jan 2016 um 15:38 Uhr)
  Mit Zitat antworten Zitat