Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];

Вниз

Переполнение стека при 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.015 c
2-1153405685
BFG9k
2006-07-20 18:28
2006.08.06
Хранение древовидных структур


2-1153297247
SergP.
2006-07-19 12:20
2006.08.06
Настройки дельфи и try except end...


15-1152613746
SoftService
2006-07-11 14:29
2006.08.06
J2ME compiler


1-1151048370
Darvin
2006-06-23 11:39
2006.08.06
Особенности запуска процесса


8-1139222461
DelphiFan
2006-02-06 13:41
2006.08.06
Определить DPI у JPEG-а





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский