Цитата:
ошибка не в типе данных, а в кривом использовании property. Правильно понял?
|
Правильно.
Цитата:
Не исключаю что при таком вызове Destroy могут быть подводные камни. Тогда какие?
|
ВСЕ классы используют именно этот механизм. А вот если сделать так, как сделали Вы...
в тех же книгах Вы увидите рекомендацию использовать FreeAndNil.
запример здесь -
http://www.gunsmoker.ru/2009/04/freeandnil-free.html
Которая вызывает TObject.Free, и затем обнуляет поданый ей указатель.
А про Ваш free она ничего не знает и никогда его не вызовет.
Про SetLength в деструкторе.
В Delphi есть несколько категорий типов, которые имеют автоматическое время жизни. Это интерфейсы, строки, и всякие динамические массивы.
При входе в процедуру/функцию, в которой есть переменные таких типов, или созданию объекта/структуры, в котором есть поля таких типов, они автоматически инициализируются
nil-ом, что в случае строк и массивов эквивалентно массиву нулевой длины.
И соответственно при выходе из процедуры/функции или уничтожению объекта/структуры, будут уничтожены и такие автоматические объекты.
В Вашеи случае в объекте типа TEventList есть поле типа динамический массив, а в структуре TEvent ести два поля типа String. При разрушении TEventList автоматически будет вызван финализатор для поля items, который сначала проведёт финализацию всех своих элеиентов, при этом в каждом уничтожатся строки F_1 и F_3, а затем будет уничтожен сам массив. Но не забывайте, что наследники TObject не имеют автоматического время жизни, по этому все созданные руками объекты нужно уничтожать самому.