Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.06;
Скачать: CL | DM;

Вниз

Переполнение стека при inherited Create;   Найти похожие ветки 

 
Прогер   (2006-06-26 09:05) [0]

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


 
Palladin ©   (2006-06-26 09:10) [1]

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


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

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

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


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

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


 
palva ©   (2006-06-26 09:37) [4]

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


 
Loginov Dmitry ©   (2006-06-26 11:25) [5]

> а в некоторых 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.



Страницы: 1 вся ветка

Текущий архив: 2006.08.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.044 c
2-1152643980
Лёха
2006-07-11 22:53
2006.08.06
Работа с outlook


3-1148986218
Iehbr
2006-05-30 14:50
2006.08.06
Запрос на выборку из дву таблиц


2-1152857678
NaLom
2006-07-14 10:14
2006.08.06
подскажите округление


2-1152701048
Levin_610
2006-07-12 14:44
2006.08.06
постановка хука на клавиатуру и мышь?


15-1152596788
dera
2006-07-11 09:46
2006.08.06
Что за файлы *.msi и почему не запускаются под XP?