Главная страница
    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.039 c
1-1117698583
oaken
2005-06-02 11:49
2005.06.29
Доступ к "чужим" окнам и контролам


14-1117561565
Juice
2005-05-31 21:46
2005.06.29
FastNet есть в Д6 ?


10-1094808578
Kusto
2004-09-10 13:29
2005.06.29
Как вернуть список строк?


6-1112392985
Muh
2005-04-02 02:03
2005.06.29
Почему у флешгета получается, а у меня нет :)


1-1118183356
Gopher
2005-06-08 02:29
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский