Версия для печати
КОМПИЛЯТОР.Не производится финализация интерфейсных ссылок в основном модуле
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=759Алексей Вуколов
дата публикации 11-03-2003 18:58
КАТЕГОРИЯ КОМПИЛЯТОР.Не производится финализация интерфейсных ссылок в основном модуле ПРОДУКТ Delphi 5,6 ПЛАТФОРМА Согласно концепции интерфейсных ссылок, они должны обнуляться при выходе из области видимости. И это правило работает нормально, если такие ссылки объявлены как поля в классах или как переменные в процедурах и модулях. Однако если такие ссылки объявлены в основном модуле программы, компилятор не генерирует код финализации. Если интерфейсная ссылка будет ссылаться на объект, порожденный внутри программы, то ничего страшного, но если это какой-то внешний COM объект, то последствия могут быть самые неприятные.
program Stone; {$APPTYPE CONSOLE} uses SysUtils; type TSomeObject = class(TInterfacedObject) destructor Destroy; override; end; { TSomeObject } destructor TSomeObject.Destroy; begin writeln('destroyed'); //<- сюда управление не попадает inherited; end; var i : IUnknown; begin i := TSomeObject.Create; end.
Типовые решенияprocedure Test; var i : IUnknown; begin i := TSomeObject.Create; end; begin Test; end.
КомментарийВсе чистая правда. Скорее всего, этот подводный камень существует во всех версиях Delphi, с тех пор как в нем появились интерфейсы.
При завершении программы потери ресурсов ОС можно не бояться, но если в деструкторе выполнялось что-то функционально важное, тут получим настоящие "грабли".