Добрый день!
На "Круглом столе" и в некотрых других источниках встречал утверждения, что нельзя вызывать деструктор объекта (Destroy/Free) из другого метода этого же объекта (причины, вроде бы понятны). Но как быть с тем, что в самой VCL такие вызовы используются (например, реализация метода TCustomForm.Release и TInterfacedObject._Release)?
Так можно или нельзя?
Большое спасибо.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
16-08-2005 13:52 | Комментарий к предыдущим ответам
2 Anatoly Podgoretsky:
Вызов напрямую Destroy опасен. Free это делает безопасно.
Из метода этого же объекта? А смысл? Там раньше все свалится, если Self=nil. См., например, TInterfacedObject._Release или TXMLDocument._Release.
Проблемы взникают тогда, когда методы удалённого объекта обращаются после его удаления к полям несуществующего объекта или иным способом используют указатель Self. Если же этого нет, удалять объект можно и из его метода. На этом и основана работа Release: этот метод ставит в очередь окна сообщение CM_Release и больше ничего не делает. А обработчик CM_Release не обращается к Self. И те методы, которые лежат "выше", тоже не обращаются к Self, поэтому удаление формы проходит успешно.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.