Освобождение интерфейсов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Освобождение интерфейсов

Сообщение MageSlayer » 10.07.2010 15:08:53

Хай

Сейчас в компиляторе есть, не совсем понятная мне, особенность.
При освобождении интерфейса, сначала вызывается _Release, а уже потом переменная хранящая собственно указатель интерфейса получает значение nil.
Спрашивается - это by design или просто реализация такая?

Тестовый пример ниже.
Код: Выделить всё
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

type
  IIntf = interface
    ['{2238A7F7-4C08-456B-BEF2-429D8472B4AC}']
  end;

  TClass2 = class;

  { TClass1 }

  TClass1 = class(TInterfacedObject, IIntf)
    private
      FOwner:TClass2;
      FStr:string;
    public
      constructor Create(Owner:TClass2);
      destructor Destroy;override;
  end;

  { TClass2 }

  TClass2 = class
    private
      I:IIntf;
    public
      constructor Create;
      destructor Destroy;override;

      procedure WriteLn;
  end;

{ TClass1 }
constructor TClass1.Create(Owner: TClass2);
begin
  inherited Create;
  FOwner:=Owner;
end;

destructor TClass1.Destroy;
begin
  FOwner.WriteLn;
  inherited Destroy;
end;

{ TClass2 }

constructor TClass2.Create;
begin
  inherited;

  I:=TClass1.Create(Self);
end;

destructor TClass2.Destroy;
begin
  I:=nil;
  inherited Destroy;
end;

procedure TClass2.WriteLn;
begin
  if I <> nil then
    System.WriteLn( 'I <> nil' );
end;

var
  O2:TClass2;
begin
  O2:=TClass2.Create;
  O2.Free;
end.


Этот пример выводит 'I <> nil' хотя в момент вызова TClass2.Writeln количество ссылок уже упало до нуля и вызвался деструктор TClass1.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Освобождение интерфейсов

Сообщение Иван Шихалев » 10.07.2010 18:45:56

Деструктор вызвался, но еще не закончил свою работу, все логично. Было бы странно, если б иначе.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Освобождение интерфейсов

Сообщение Max Rusov » 10.07.2010 18:51:54

Есть такая особенность. Я писал об этом здесь:

viewtopic.php?f=37&t=4745
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Освобождение интерфейсов

Сообщение MageSlayer » 11.07.2010 11:24:46

Max Rusov писал(а):Есть такая особенность. Я писал об этом здесь:

http://www.freepascal.ru/forum/viewtopi ... =37&t=4745


Понятно, что такая проблема есть. И в Дельфи по-другому.
Вопрос - это баг/несовместимость или это просто детали реализации, которые могут поменяться?
Если баг/несовместимость, то это можно зарепортить на баг-трекер :).
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru