2013-03-29 2 views
24

ли освободив общие списки как TList<string>, TList<Double>, TList<Integer> или TList<TMyRecord>, где TMyRecord объявлен как:Как освободить общий TList <T>?

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

требует дополнительной работы или является MyList.Free достаточно?

+14

+1. Очень красиво написанный вопрос. –

ответ

27

Исполнительное резюме

MyList.Free достаточно.

Подробный ответ

TList<T> общий контейнер имеет его содержимое. Когда вы освобождаете контейнер, содержимое также удаляется.

Теперь, если T является неуправляемой ссылкой, либо указателем, либо классом, то список владеет ссылкой. Он не владеет тем, на что ссылается ссылка. Поэтому, если у вас есть TList<TObject>, добавьте некоторые объекты, а затем освободите список, ссылки будут удалены, но объекты останутся. Итак, чтобы справиться с этим, есть TObjectList<T>. Этот контейнер может быть сконфигурирован так, чтобы владеть объектами, а также ссылками, и таким образом удалять объекты в соответствующий момент.

Теперь в вашем сценарии каждый из ваших списков содержит либо тип значения, либо управляемый тип. Список владеет этими объектами и распоряжается им, когда он уничтожен. Поэтому для всех ваших списков MyList.Free - это все, что нужно.