


- Код: Выделить всё
program project1;
uses
SysUtils;
type
IFace = interface
end;
{ TFace }
TFace = class(TInterfacedObject, IFace)
public
function QueryInterface(constref iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
destructor Destroy; override;
end;
{ TFace }
function TFace.QueryInterface(constref iid: tguid; out obj): longint; stdcall;
begin
result := QueryInterface(iid, obj);
end;
function TFace._AddRef: longint; stdcall;
begin
result := inherited _AddRef;
WriteLN('+REFER =' + IntToStr(RefCount));
end;
function TFace._Release: longint; stdcall;
begin
WriteLN('-DEREF =' + IntToStr(RefCount - 1));
result := inherited _Release;
end;
destructor TFace.Destroy;
begin
WriteLN('Intface object destroyed');
inherited Destroy;
end;
function CreateFace: IFace; stdcall;
begin
result := TFace.Create;
end;
var
face: IFace;
begin
face := CreateFace;
face := nil;
WriteLN('Reaching end.');
end.
Выводит вот что:
- Код: Выделить всё
+REFER =1
+REFER =2
-DEREF =1
Reaching end.
-DEREF =0
Intface object destroyed
Почему, спрашивается, интерфейс освобождается только уже после того, как ему присвоили nil ???? Это какая-то утечка подсчёта ссылок.
Я почему-то убеждён, что он должен писать сообщение об освобождении до того, как напишет Reaching end.
FPC 2.6.0
Помогите. что мне с этим делать