Форум: "Основная";
Поиск по всему сайту: 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.022 c
1-80861           Air                   2002-04-13 13:03  2002.04.25  
Как поймать сообщение клиента при дисконнекте?


1-80910           Chainik               2002-04-15 10:43  2002.04.25  
Функциональные клавиши


1-81000           stormick              2002-04-12 19:35  2002.04.25  
Кнопка на рабочем столе....


1-80916           Song                  2002-04-15 09:49  2002.04.25  
Чего-то с утра башка не варит:) Вообщем есть заполненный TreeView


14-81041          vlv                   2002-03-19 18:50  2002.04.25  
База данных - слова