Форум: "Corba";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизПомогите найти ошибку в коде Найти похожие ветки
← →
Cobalt © (2004-09-07 09:46) [0]Увидел этот код в http://delphimaster.net/view/15-1094389442/
Посмотрел его, скомпилировал, запустил по шагам - и не понял - а откуда AV берётся???
Если кто понимает - объясните, пожалуйста.
noname_ (06.09.04 17:06) [120]program testintf;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
ITest = interface(IUnknown)
procedure Delete;
end;
TTest = class(TInterfacedObject, ITest)
private
protected
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
procedure Delete;
end;
var
gTest: ITest;
procedure TTest.Delete;
begin
Free;
end;
function TTest._AddRef: Integer;
begin
Result := -1;
end;
function TTest._Release: Integer;
begin
Result := -1;
end;
procedure NewObj;
begin
gTest := TTest.Create;
end;
function GetObj: ITest;
begin
Result := gTest;
end;
procedure DoTest;
var
i: Integer;
s1: string;
begin
NewObj;
GetObj.Delete;
for i := 1 to 500 do
s1 := StringOfChar(#0, 200000);
end;
begin
try
DoTest;
WriteLn("all right");
except
on E: Exception do
WriteLn(E.Message)
else
WriteLn("unknown exception");
end;
end.
← →
Ломброзо © (2004-09-07 11:31) [1]Use Debug DCUs + Call Stack
← →
Cobalt © (2004-09-08 11:51) [2]Итак, что я смог выяснить - в конце процедуры DoTest вызывается IntfClear
Как я понял, вызывается она для интерфейса, к которому мы (я? кому как удобнее) обращались GetObj.Delete;
Как оказывается, для этого интерфейса резервируется место в стеке (скрытая переменная), и потом он освобождается.
Итого:
1) Интерфейс (реализация методов интерфейса) не должен освобождать реализующий его объект класса.
2) Класс, реализующий интерфейсы, не имеет права уничтожаться в случае если он предоставил хоть один "экземпляр" (?) интерфейса.
← →
VMcL © (2004-09-08 13:54) [3]>>Cobalt © (08.09.04 11:51) [2]
>2) Класс, реализующий интерфейсы, не имеет права уничтожаться в случае если он предоставил хоть один "экземпляр" (?) интерфейса.
Естественно. Именно для этого используется автоматический подсчет ссылок, котрый здесь "внаглую отключен".
Страницы: 1 вся ветка
Форум: "Corba";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.041 c