Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Подводные камни
  
О разделе

Список по категориям
Общий список

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  13:23[Войти] | [Зарегистрироваться]

КОМПИЛЯТОР.Не производится финализация интерфейсных ссылок в основном модуле

Алексей Вуколов
дата публикации 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 сообщения
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования