Форум: "Потрепаться";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
ВнизОсобенности вызовов конструкторов Найти похожие ветки
← →
jack128 © (2004-07-06 17:50) [0]Как известно конструктор объекта можно использовать в двух контекстах
1) как классовый метод
Instance := TMyCoolObject.Create();
2) как обычный метод
Instance.Create();
а вот код который компилятор ренерит при вызове коструктора можно разделить на три группы
1)
Instance := TMyCoolObject.Create();
в этом случае происходит вызов _ClassCreate(это влечет за собой вызов NewInstance а потом вызов собственно тела конструктора. если в конструкторе возникло исключение, то вызывается FreeInstance
2) Instance.Create();
последовательность вызовов таже, что и в первом случае, но в _ClassCreate передается флаг, указывающий на то что конструктор вызывается как обычный метод и вызова NewInstance не поисходит. Однако если в конструкторе возникло исключение, то теста на этот флаг не делается и соответственно объект уничтожается.
Instance.Create(); //если здесь возникло исключение, то Instance - уничтожается
3)
constructor TChildMyCoolObject.Create;
begin
inherited Create(); // тут происходит просто передача управления в унаследованный конструктор. Безо всяких дополнительных вызовов.
end;
Собственно все эти исследования меня заставила провести особенность второго варианта. Если во время вызова Instance.Create() возникло исключение, то объект уничтожается. Чем вызвано такое (ИМХО нелогичное) решение??
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.042 c