Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Переполнение стека при inherited Create; [D7, Win2k]


Прогер ©   (2006-06-26 09:05:00) 

Наследование следующее: TComponent, от него TMyClass01, от него TMyClass02, от него TMyClass03. Мои классы в свои конструкторах вызывают inherited Create(...) родителя. В программе создаётся объект класса TMyClass03. В момент Obj:= TMyClass03.Create(...) возникает переполнение стека. При отладке видно, что переполнение возникает при вызове inherited Create в классе TMyClass01. И вот понять не могу, как исправить ошибку... Уведечение памяти под стек приводит к Access Violetion в том же месте кода.


Loginov Dmitry   (2006-06-26 11:25:00) [1]

> а в некоторых inherited Create(Self,  ....).


Это вообще бредовая идея. Откомпилируйте следующий код и кое-что станет ясно:


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 TMyObj = class(TComponent)
 public
   constructor Create(AOwner: TComponent); override;
 end;

 TMyObj1 = class(TMyObj)
 public
   constructor Create(AOwner: TComponent); override;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TMyObj }

constructor TMyObj.Create(AOwner: TComponent);
begin
 inherited;
 Showmessage(IntToStr(Integer(Self)));
end;

constructor TMyObj1.Create(AOwner: TComponent);
begin
 inherited;
 Showmessage(IntToStr(Integer(Self)));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TMyObj1.Create(Self);
end;

end.


palva   (2006-06-26 09:37:00) [2]

> Интересно, а почему так?
Это зависит от того, как используются параметры конструктора, а это может сказать автор конструктора или составленная им документация.


Прогер   (2006-06-26 09:16:00) [3]

В некоторых конструкторах я указывал inherited Create(AOwner, ....), а в некоторых inherited Create(Self,  ....). Когда все изменил на inherited Create(AOwner, ....) - всё заработало. Интересно, а почему так?


Palladin   (2006-06-26 09:10:00) [4]

декларацию и реализацию конструкторов в студию...


Юрий Зотов   (2006-06-26 09:10:00) [5]

Коструктор вызывает сам себя.

Похоже, где-то пропущено inherited и написано просто Create. Или конструктор вызывает другую процедуру, а та - снова конструктор (возможно, тоже не напрямую).


Наверх

Титульная страница Поиск, карта сайта Написать письмо