Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1116279827
normandia
2005-05-17 01:43
2005.06.29
sum только по некоторым записям


1-1118127516
Andy BitOff
2005-06-07 10:58
2005.06.29
Ошибка: "Cannot open file ..."


14-1117479218
NailMan
2005-05-30 22:53
2005.06.29
Надо есть правильные сладости! :-)))


14-1117290488
Ломброзо
2005-05-28 18:28
2005.06.29
Как подписаться на буржуйскую группу новостей?


14-1117696261
Nik8.
2005-06-02 11:11
2005.06.29
Загадка - Два брата





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский