Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.07.07;
Скачать: CL | DM;

Вниз

Создание класса в 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.006 c
3-1290496214
savinkin
2010-11-23 10:10
2013.07.07
oracle


2-1353170309
toropoff
2012-11-17 20:38
2013.07.07
{$DEFINE ..} как с ним работать...


15-1361224437
Германн
2013-02-19 01:53
2013.07.07
Компьютер с Win7 ни с того ни с сего, вдруг, отказывается спать.


2-1352981138
Anariem
2012-11-15 16:05
2013.07.07
Timer


3-1289297780
daniyar
2010-11-09 13:16
2013.07.07
Как добавить Таблицы Access в дерево TreeView