Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.47 MB
Время: 0.006 c
14-81053
Kozhanov
2002-03-19 15:06
2002.04.25
IMHO ?


1-80991
eSKey
2002-04-12 15:38
2002.04.25
Кто знает - шифрование и хранение пароля


1-80909
UserL
2002-04-12 13:39
2002.04.25
Не получаеться совсем.


1-80878
Демон
2002-04-14 10:47
2002.04.25
HELP!!! JPEG в BMP


1-80915
Sparky
2002-04-15 13:08
2002.04.25
SendMessage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский