Господа, можете подсказать, почему код ниже в Lazarus выдаёт ошибку а в Delphi (любой версии) нет ?
Вызов uTest3.Test;
В FPC на строке T.Free; будет Access violation (а точнее не сразу а после выхода из функции)
Соответственно если закоментить то всё работает но утечка...(
- Код: Выделить всё
unit uTest3;
interface
uses
Classes, SysUtils;
type
IMyTable = interface
function GetTableName: String;
function GetImplementor: TObject;
end;
TMyXXXTable = class(TObject, IMyTable)
private
function GetTableName: String;
function GetImplementor: TObject;
protected
function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): Longint; virtual; stdcall;
function _AddRef: Integer; virtual; stdcall;
function _Release: Integer; virtual; stdcall;
end;
function Test: String;
implementation
{ TMyXXXTable }
function TMyXXXTable.GetTableName: String;
begin
Result := 'XXX';
end;
function TMyXXXTable.GetImplementor: TObject;
begin
Result := Self;
end;
function TMyXXXTable.QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): Longint; stdcall;
begin
if GetInterface(IID, Obj) then
Result := S_OK
else
Result := E_NOINTERFACE;
end;
function TMyXXXTable._AddRef: Integer; stdcall;
begin
Result := -1;
end;
function TMyXXXTable._Release: Integer; stdcall;
begin
Result := -1;
end;
function GetTable: IMyTable;
begin
Result := TMyXXXTable.Create;
end;
procedure ReleaseTable(var Table: IMyTable);
var
T: TMyXXXTable;
begin
if Table.GetImplementor is TMyXXXTable then
begin
T := Table.GetImplementor as TMyXXXTable;
T.Free; // FPC ???
end;
end;
function Test: String;
var
TT: IMyTable;
begin
TT := GetTable;
Result := TT.GetTableName;
ReleaseTable(TT);
end;
end.