Понимание распределения памяти для TList <RecordType> - PullRequest
3 голосов
/ 23 декабря 2010

Я должен хранить TList чего-то, что может быть легко реализовано как запись в Delphi (пять простых полей). Однако мне не ясно, что происходит, когда я делаю TList<TMyRecordType>.Add(R).

Поскольку R - это локальная переменная в процедуре, в которой я создаю свой TList, я предполагаю, что память для него будет освобождена, когда функция вернется. Оставляет ли это неверный указатель записи в списке? Или список знает, чтобы скопировать по назначению? Если первое, я полагаю, мне придется вручную управлять памятью для R с New () и Dispose (), это правильно?

Кроме того, я могу «преобразовать» свой тип записи в тип класса, просто объявив поля общедоступными (даже не удосужившись сделать их формальными свойствами). Это считается нормальным, или я должен потратить время на создание класса с закрытыми полями и общими свойствами?

1 Ответ

10 голосов
/ 23 декабря 2010

Упрощено: записи являются блоками данных и передаются по значению, то есть путем их копирования, по умолчанию.TList<T> сохраняет значения в массиве типа T. Таким образом, TList<TMyRecordType>.Add(R) скопирует значение R в массив в позиции Count и увеличит значение Count на единицу.Не нужно беспокоиться о выделении или освобождении памяти.

Более сложные проблемы, о которых вам обычно не нужно беспокоиться: если ваша запись содержит поля типа строки, типа интерфейса, динамического массива илизапись, которая сама содержит поля одного из этих типов, тогда это не просто копия данных;вместо этого используется CopyRecord из System.pas, который обеспечивает правильное обновление счетчиков ссылок.Но обычно вам не нужно беспокоиться об этой детали, если вы не используете Move, чтобы переместить биты вокруг себя, или не выполняете аналогичные операции низкого уровня.

...