Показать сообщение отдельно
  #7  
Старый 04.03.2015, 18:19
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
ошибка не в типе данных, а в кривом использовании 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 не имеют автоматического время жизни, по этому все созданные руками объекты нужно уничтожать самому.
Ответить с цитированием