Wenn Sie mit Listen von Elementen arbeiten, in denen die Listen nur als temporärer Container dienen - welche Listentypen würden Sie mir empfehlen?
Ich
Etwas, das dies möglich machen würde, ohne Lecks zu verursachen:
%Vor%Welche Möglichkeiten habe ich? Hier geht es um Delphi 2009, aber um des Wissens willen, erwähnen Sie bitte auch, ob es in diesem Zusammenhang 2010 etwas Neues gibt.
Die Standardlistenklassen wie TList
, TObjectList
, TInterfaceList
usw. implementieren keine automatisierten Lebenszyklen, daher müssen Sie sie manuell freigeben, wenn Sie sie nicht mehr verwenden. Wenn Sie eine Listenklasse haben wollen, die über eine Schnittstelle erreichbar ist, müssen Sie diese selbst implementieren, zB:
Ein (irgendwie hässlicher) Workaround dafür ist, eine "Autodestroy" -Schnittstelle zusammen mit der Liste zu erstellen. Es muss den gleichen Umfang haben, damit die Liste bei der Freigabe der Schnittstelle ebenfalls zerstört wird.
%Vor%Ihr Anwendungsbeispiel wird ebenfalls komplizierter.
%Vor%Um alles zu unterstützen, was Sie wollen, müsste die Sprache zwei Dinge unterstützen:
In der Zwischenzeit können Sie Interfaces anstelle der Garbage Collection verwenden (da die Schnittstellen als Referenz gezählt werden, sobald sie den Gültigkeitsbereich verlassen haben, werden sie freigegeben). Wie für initialisierte lokale Variablen könnten Sie einen Trick verwenden, der dem ähnlich ist, was ich hier beschreibe: Block-Level-Variablen für Zweige in Delphi deklarieren
Und um des Spaßes willen, hier ist eine Konsolenanwendung, die die Verwendung von "falschen" lokalen Variablen und Schnittstellen demonstriert, um temporäre Listen zu erhalten, die leicht initialisiert werden und automatisch freigegeben werden:
%Vor% Eine andere Option ist die Implementierung eines generischen IEnumerable
Adapters (als eine Möglichkeit, die Compiler-Anforderung for .. in
zu erfüllen) und die Referenzzählung der Schnittstelle. Ich weiß nicht, ob das Folgende in Delphi 2009 funktioniert, es scheint in Delphi XE zu funktionieren:
In der Jedi-Code-Bibliothek existiert die Funktion Guard , die bereits was implementiert Gabrs Code tut es.
Tags und Links delphi list delphi-2009