Главная страница
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
3-1115954496
Елена
2005-05-13 07:21
2005.06.29
Обнулениеячейки в пародоксовской табличке.


14-1117257328
boriskb
2005-05-28 09:15
2005.06.29
Как молодежь коверкает наш язык :)


4-1115072311
jcrush
2005-05-03 02:18
2005.06.29
Добавить изменить иконку в треи


1-1118249091
terra0
2005-06-08 20:44
2005.06.29
Динамические массивы


14-1117442964
leonidus
2005-05-30 12:49
2005.06.29
Как из lsd словарей Lingvo получить словари в текстовом виде?