Главная страница
    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.46 MB
Время: 0.007 c
7-81098
star
2002-01-24 17:45
2002.04.25
О точных временных интервалах ...


1-80903
VJar
2002-04-14 23:33
2002.04.25
Самокопирование


1-80970
Jaxtor
2002-04-12 11:21
2002.04.25
Закрытие формы MDIChild программным методом


4-81110
SerVS - S
2002-02-18 20:01
2002.04.25
Подскажите плз как вырубить Ctrl+Alt+Del


1-80992
shane54
2002-04-12 16:43
2002.04.25
Вроде элементарно.... но как? :)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский