Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Помогите найти ошибку в коде   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.027 c
14-1117204178
Сатир
2005-05-27 18:29
2005.06.29
У кого есть фотка команды Microsoft 78-го года ?


8-1110101334
romantic
2005-03-06 12:28
2005.06.29
Положение TImage в Scrollbox`е


1-1118209050
Ega23
2005-06-08 09:37
2005.06.29
Перекрытие методов TDataLink


14-1117702754
КаПиБаРа
2005-06-02 12:59
2005.06.29
Какой из методов обучения более правильный?


1-1117813072
Dezmond
2005-06-03 19:37
2005.06.29
Сообытие или сообщение о деактивации окна