Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Вниз

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


Starkom   (2002-04-12 15:21) [0]

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

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



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


> inherited Control;


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



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

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



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

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



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

В конструкторе ты 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:43) [5]

есть конструктор
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;



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

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



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

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

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;



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

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



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

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



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

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



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

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




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.028 c
1-80898           Candyras              2002-04-15 00:15  2002.04.25  
Вот такая проблемка...


1-80925           Fareader              2002-04-11 11:23  2002.04.25  
Русский язык в F1Book


1-80913           Reef                  2002-04-15 12:43  2002.04.25  
PChar and string


3-80802           Glonia Zbanov         2002-04-05 10:58  2002.04.25  
Народ! Обьясните конструкцию запроса.


1-81009           Demon Ltd             2002-04-13 00:05  2002.04.25  
Работа повторно с меню