Версия для печати


КОМПИЛЯТОР.Не производится финализация интерфейсных ссылок в основном модуле
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, с тех пор как в нем появились интерфейсы.

При завершении программы потери ресурсов ОС можно не бояться, но если в деструкторе выполнялось что-то функционально важное, тут получим настоящие "грабли".