Очистить TList или TObjectList
Я немного озадачен тем, что нужно использовать для хранения объектов в списке.
До сих пор я использовал TList
и освобождал каждый элемент в цикле. Затем я обнаружил TObjectList
, который делает это автоматически из Free
. Затем я увидел это из документа TList.Clear
:
Вызовите Clear
, чтобы освободить массив Items и установите Count
на 0. Clear
также освобождает память, используемую для хранения массива Items
, и устанавливает Capacity
на 0.
Так что это в основном то же самое. Так
для TList
mylist.Clear;
myList.Free;
совпадает с TObjectList
?
myList.Free;
Может ли TObjectList
использоваться только для элементов как классов или я могу хранить записи?
Ответы
Ответ 1
1. TList не освобождает элементы с помощью Clear
или Free
.
aList.Clear;
Просто установите aList.Count := 0
, не освобождая элементы aList.Items[]
. Таким образом, вы будете утечки памяти. Вам понадобится явный бесплатный как таковой:
for i := 0 to aList.Count-1 do
TObject(aList[i]).Free;
Но это то, что TObjectList
делает...:)
О TObjectList
, стоит сказать, что TObjectList.Destroy
вызывает Clear
.
Итак,
aObjectList.Clear;
aObjectList.Free;
точно совпадает с
aObjectList.Free;
2. Чтобы сохранить список записей, вы можете использовать динамический массив.
Вы получите все TList
методы (и более) с нашей динамической оболочкой массива. То есть Add / Delete / Clear / Count / IndexOf / Find
...
Он имеет встроенные функции сериализации (в двоичном или JSON), автоматическую сортировку и сравнение (с использованием RTTI), которые не существуют с помощью TList/TObjectList
. От Delphi 5 и более поздних версий.
В более современной версии Delphi вы можете использовать generics для обработки динамического массива, если вы не хотите использовать стороннюю библиотеку.
Ответ 2
Не тот же TList.Clear
освобождает только память, предназначенную для хранения указателей, а не объектов, на которые они указывают.
Чтобы избежать утечек памяти, вам нужно освободить память самостоятельно, как вы делали, или использовать TObjectList
.
Чтобы ответить на второй вопрос, TObjectList
не поддерживает сохранение записей. В этом случае вам нужно использовать TList
(или что-то еще).
Ответ 3
Если вы используете последнюю версию Delphi, я предлагаю вам использовать общий список.
Теперь вам, вероятно, придется делать много кастинга, когда вы используете объекты из списка. С общим списком вам больше не нужно этого делать.
Например, если у вас есть:
TMyObject = class(TObject);
Затем вы создадите список следующим образом:
TMyObjectList = TObjectList<TMyObject>;
В вики Embarcadero есть статья:
http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TObjectList_(Delphi)
Ответ 4
Прочитайте более подробное описание документации:
Clear также освобождает память, используемую для хранения массива Items
Только память для самого массива освобождается, а не память, используемая отдельными элементами внутри массива.
Ответ 5
Действительно просмотр кода TObjectList
в файле contnrs.pas OwnObjects
ничего не делает. FOwnObjects
- это переменная, объявленная в частной части TObjectList
, которая нигде не используется в коде TObjectList
(за исключением просто назначения значения), и в ней нет переопределенной процедуры Clear
.
Поэтому я боюсь, что необходимо освободить память так же, как в TList
.