Форум: "Основная";
Текущий архив: 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
Память, быделенная под экземпляр, освободится - за это-то как раз волноваться не нужно. А вот об освобождении памяти, возможно явно тобой выделенной в контексте работы конструктора, ты должен заботиться сам. Обычно это делать удобней всего в контексте деструктора, поскольку в рез-те исключения в конструкторе перед освобождением памяти под экз-р будет вызван твой деструктор.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c