![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переполнение стека при 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. Или конструктор вызывает другую процедуру, а та - снова конструктор (возможно, тоже не напрямую).