Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по конструкторам объектов


Starkom ©   (2002-04-12 15:21:00) 

можно ли в конструкторе объекта, допустим наследованного от TControl сделать подобное:
inherited Control;
if что-то then
begin
Self:=nil;
exit;
end;

Если да, то что будет с памятью?


Digitman   (2002-04-12 16:09:00) [1]

>Starkom
Память, быделенная под экземпляр, освободится - за это-то как раз волноваться не нужно. А вот об освобождении памяти, возможно явно тобой выделенной в контексте работы конструктора, ты должен заботиться сам. Обычно это делать удобней всего в контексте деструктора, поскольку в рез-те исключения в конструкторе перед освобождением памяти под экз-р будет вызван твой деструктор.


Starkom   (2002-04-12 16:01:00) [2]

ок, попробую
спасибо.


Бурундук   (2002-04-12 15:56:00) [3]

Конструктор всегда вызывается в неявном try-блоке.
При возникновении любой исключительной ситуации в нём
(если, конечно, она внутри него не обработана)
память, выделенная под объект, освобождается.
Где об этом почитать можно - не помню.


Starkom   (2002-04-12 15:52:00) [4]

2 Бурундук:
Точно память очистится? Можно где-нибудь про это поподробнее почитать?


Бурундук   (2002-04-12 15:49:00) [5]

Просто возбуди эксепшн в конструкторе
- и память автоматически очистится, и цикл прервётся.
а вне цикла ее обработай

try
for i:=0 to n-1 do
begin
AnyArray[i]:=TMyObject.CreateFromAnotherObject(AnotherObject[i]);
//if not Assigned(AnyArray[i]) then break;//
end;
except
on MyExcept do ...
end;


kull   (2002-04-12 15:46:00) [6]

ах вот вы о чем, извращенцы...


Starkom   (2002-04-12 15:43:00) [7]

есть конструктор
constructor CreateFromAnotherObject(AnotherObject)
есть цикл, в котором вызываются конструкторы
если AnotherObject не отвечает каким-либо условиям, конструктор должен как-то оповестить вызывающий метод, о том, что все плохо (просто цикл должен в таком случае немедленно завершиться).
Хотелось бы что-то такое, чтобы все работа с очищением памяти в таком случае находилоась прямо в конструкторе:
for i:=0 to n-1 do
begin
AnyArray[i]:=TMyObject.CreateFromAnotherObject(AnotherObject[i]);
if not Assigned(AnyArray[i]) then break;//
end;


Бурундук   (2002-04-12 15:39:00) [8]

В конструкторе ты Self не изменишь, да это и смысла не имеет.
Можно сделать что-нибудь вроде

inherited Create;
if что-то then
begin
Abort;
end;

function CreateMyObj: TMyObj;
begin
try
Result := TMyObj.Create;
except
on EAbort do Result := nil;
end;
end;


Starkom   (2002-04-12 15:34:00) [9]

так как раз и надо, чтобы при каких-то условиях, Self после вызова конструктора был nil


kull   (2002-04-12 15:34:00) [10]

Зачем Self:=nil - это некрасиво и некоректно.
Вопрос один: зачем это надо?


kull   (2002-04-12 15:33:00) [11]


> inherited Control;


не понял что-то... и потом в конструкторе уже Self<>nil.


Наверх

Титульная страница Поиск, карта сайта Написать письмо