Как освободить объект, который находится в записи?
Здесь у меня сложная ситуация, я думаю. Мне нужно иметь возможность освободить объект, который является полем записи. Я обычно писал бы код очистки в деструкторе, если бы это был класс. Но так как типы записей могутввести "деструктор»как можно было бы позвонитьTObject (поле) .Free; ?
Там'я буду предсказывать два типа использования:
Замена записи на новую.
Я думаю, что это использование было бы легко реализовать. Поскольку записи являются типами значений и поэтому они копируются при присваивании, я могу перегрузить оператор присваивания и освободить объекты, принадлежащие старой записи. (
Редактировать: Перегрузка назначения не былаТаблица. Тот'новая информация для меня ..)
Выход из области, где определена переменная записи.
Я могу подумать о закрытом методе, который освобождает объекты, и этот метод можно вызывать при возбуждении области видимости вручную. НО, вот тот же вопрос: как сделать его большерекордно? Такое поведение похоже на класс ...
Вот образец (и, очевидно,не по назначению):
TProperties = record
... some other spesific typed fields: Integers, pointers etc..
FBaseData: Pointer;
FAdditionalData: TList;
//FAdditionalData: array of Pointer; this was the first intended definition
end;
Предполагать,
FAdditionalData:=TList.Crete;
вызывается в конструкторе записей или вручную в области видимости переменной записи, открывая доступ к полю как
procedure TFormX.ButtonXClick(Sender: TObject);
var
rec: TProperties;
begin
//rec:=TProperties.Create(with some parameters);
rec.FAdditionalData:=TList.Create;
//do some work with rec
end;
После выхода из области действия ButtonClickзапись не более, чемTList все еще сохраняет свое существование, что вызывает утечки памяти ...