Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



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


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


15-1361431802
Andrey869
2013-02-21 11:30
2013.07.07
Оформление окна об ошибки


15-1361424251
Savek
2013-02-21 09:24
2013.07.07
Кто сказал, что Delphi только для баз данных?


15-1361478603
Юрий
2013-02-22 00:30
2013.07.07
С днем рождения ! 22 февраля 2013 пятница




   Наверх