Welche Listen könnten als temporäre Listen dienen?

7

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

  • möchte die Liste nicht manuell löschen
  • möchte einen integrierten Listentyp (keine Frameworks, Bibliotheken, ...)
  • verwenden
  • möchte Generika

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.

    
Heinrich Ulbricht 10.11.2011, 09:17
quelle

7 Antworten

3

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:

%Vor%     
Remy Lebeau 10.11.2011, 09:33
quelle
6

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%     
gabr 10.11.2011 10:16
quelle
5

Inspiriert von Barry Kellys Blogpost hier könnten Sie Smartpointer implementieren Dein Zweck ist so:

%Vor%

Sehen Sie sich getList und Button1 an, um deren Verwendung zu sehen.

    
iamjoosy 10.11.2011 14:30
quelle
4

Um alles zu unterstützen, was Sie wollen, müsste die Sprache zwei Dinge unterstützen:

  • Müllsammler. Das ist die einzige Sache, die Ihnen die Freiheit gibt, etwas zu benutzen, ohne sich darum zu kümmern, es zu befreien. Ich würde eine Änderung in Delphi begrüßen, die uns dafür sogar teilweise unterstützt hat.
  • Die Möglichkeit lokale, initialisierte Variablen zu definieren. Auch ich würde wirklich gerne etwas in dieser Richtung sehen.

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%     
Cosmin Prund 10.11.2011 11:41
quelle
2

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:

%Vor%     
Ondrej Kelle 10.11.2011 14:27
quelle
1

Nein, nicht "out of the box" in Delphi. Ich weiß, dass Sie keine Bibliothek benötigen, aber Sie interessieren sich vielleicht für das Prinzip TDynArray .

    
philnext 10.11.2011 10:56
quelle
1

In der Jedi-Code-Bibliothek existiert die Funktion Guard , die bereits was implementiert Gabrs Code tut es.

    
Fabricio Araujo 10.11.2011 17:04
quelle

Tags und Links