Подтвердить что ты не робот

Очистить TList или TObjectList

Я немного озадачен тем, что нужно использовать для хранения объектов в списке. До сих пор я использовал TList и освобождал каждый элемент в цикле. Затем я обнаружил TObjectList, который делает это автоматически из Free. Затем я увидел это из документа TList.Clear:

Вызовите Clear, чтобы освободить массив Items и установите Count на 0. Clear также освобождает память, используемую для хранения массива Items, и устанавливает Capacity на 0.

Так что это в основном то же самое. Так

для TList

mylist.Clear;
myList.Free;

совпадает с TObjectList?

myList.Free;

Может ли TObjectList использоваться только для элементов как классов или я могу хранить записи?

4b9b3361

Ответ 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.