Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.07.07;
Скачать: [xml.tar.bz2];

Вниз

Создание класса в TRY/FINALLY.   Найти похожие ветки 

 
XXXXX   (2013-02-24 23:45) [0]

Какой вариант правильный?

1)


Obj:= TSuperClass.Create;
try
 //
finally
 Obj.Free;
end;


2)


try
  Obj:= TSuperClass.Create;

   //
finally
 Obj.Free;
end;


Если в конструкторе происходит выделение памяти или какая-нибудь инициализация?


 
Дмитрий С ©   (2013-02-24 23:54) [1]

Первый конечно. Во-втором, если у тебя Obj не была проинициализирована и ты получил исключение в конструкторе, то в итоге ты получишь AV


 
Юрий Зотов ©   (2013-02-25 00:02) [2]


> XXXXX   (24.02.13 23:45)  
> Какой вариант правильный?

Общее правило такое:

захватили какой-то ресурс (память, хэндл, что угодно другое)
try
 что-то делаем с этим ресурсом, после чего он уже не нужен
finally
 освобождаем ресурс
end

Суть в том, что если ресурс по каким-то причинам не был захвачен, то и освобождать его не нужно. Поэтому сначала - захват, потом - try.


 
Дмитрий С ©   (2013-02-25 00:11) [3]

Хотя если второй вариант переделать вот так:

Obj := nil;
try
 Obj:= TSuperClass.Create;

  //
finally
Obj.Free;
end;

то он тоже будет иметь право на жизнь. Так удобно делать, если требуется создать несколько объектов, а городить вложенные try..finally не хочется:
Obj1 := nil;
Obj2 := nil;
Obj3 := nil;
try
 Obj1:= TSuperClass.Create;
 Obj2:= TSuperClass.Create;
 Obj3:= TSuperClass.Create;

  //
finally
Obj1.Free;
Obj2.Free;
Obj3.Free;
end;


 
Игорь Шевченко ©   (2013-02-25 00:43) [4]


> Если в конструкторе происходит выделение памяти или какая-
> нибудь инициализация?


То при ошибке в нем вызывается деструктор, в котором захваченная память волшебным образом освобождается и выполняется какая-нибудь финализация



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.07.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.003 c
15-1361421713
Miha
2013-02-21 08:41
2013.07.07
пишу блокнот выдает ошибку This form of method call only allowed


2-1353205908
Вова
2012-11-18 06:31
2013.07.07
как сравнить время выполнения 2х функций


15-1360852079
Игорь Шевченко
2013-02-14 18:27
2013.07.07
Как давно это было...


15-1361737804
Юрий
2013-02-25 00:30
2013.07.07
С днем рождения ! 25 февраля 2013 понедельник


2-1352803524
Павел Калугин
2012-11-13 14:45
2013.07.07
Подскажите как правильно работать с библиотеками BPL





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