2013-03-29 8 views
24

Hat befreien generische Listen wie TList<string>, TList<Double>, TList<Integer> oder TList<TMyRecord>, wo TMyRecord wie erklärt wird:Wie man eine generische TList <T> freigibt?

type 
    TMyRecord = record 
    MyString: string; 
    MyDouble: Double; 
    MyInteger: Integer; 
    end; 

erfordern zusätzliche Arbeit oder ist MyList.Free ausreichend?

+14

+1. Sehr schön geschriebene Frage. –

Antwort

27

Zusammenfassung

MyList.Free ausreichend.

Detaillierte Antwort

Der TList<T> generischen Container seinen Inhalt besitzt. Wenn Sie den Behälter freigeben, wird auch der Inhalt entsorgt.

Wenn nun T eine nicht verwaltete Referenz ist, entweder ein Zeiger oder eine Klasse, besitzt die Liste die Referenz. Es besitzt nicht das, worauf sich die Referenz bezieht. Wenn Sie also TList<TObject> haben, fügen Sie einige Objekte hinzu, und geben Sie dann die Liste frei. Die Referenzen werden verworfen, die Objekte bleiben jedoch erhalten. Also, um damit umzugehen, gibt es TObjectList<T>. Dieser Container kann so konfiguriert werden, dass er sowohl die Objekte als auch die Referenzen besitzt und so die Objekte zum richtigen Zeitpunkt entsorgt.

In Ihrem Szenario enthält nun jede Ihrer Listen entweder einen Werttyp oder einen verwalteten Typ. Die Liste besitzt diese Objekte und entsorgt sie, wenn sie zerstört werden. Also für alle Ihre Listen ist MyList.Free alles was benötigt wird.

Verwandte Themen