Главная страница
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.048 c
2-1152879718
Начинающий 5
2006-07-14 16:21
2006.08.06
Форма


15-1152088099
Footballer
2006-07-05 12:28
2006.08.06
исходники медиа и аудио-плееров


2-1153308402
LexXL
2006-07-19 15:26
2006.08.06
архиватор


2-1153329897
HNN
2006-07-19 21:24
2006.08.06
FindDialog


2-1153123382
ksa2002
2006-07-17 12:03
2006.08.06
Редактирование DBGrid