Алексей Вуколов дата публикации 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, с тех пор как в нем появились интерфейсы.
При завершении программы потери ресурсов ОС можно не бояться, но если в
деструкторе выполнялось что-то функционально важное, тут получим настоящие
"грабли".
[Интерфейсы COM-объектов] [Классы] [Жизненный цикл]
Обсуждение материала [ 20-11-2006 17:11 ] 23 сообщения |