Вниз
Скачать: 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
1-1270642600
Дмитрий Белькевич
2010-04-07 16:16
2013.07.07
TStringList.LoadFromFile. Как автоматически определить кодировку?


15-1361735119
XXXXX
2013-02-24 23:45
2013.07.07
Создание класса в TRY/FINALLY.


15-1361421713
Miha
2013-02-21 08:41
2013.07.07
пишу блокнот выдает ошибку This form of method call only allowed


1-1309850189
adigozelov
2011-07-05 11:16
2013.07.07
ESC-команд Epson Lq 300,


15-1361392203
Юрий
2013-02-21 00:30
2013.07.07
С днем рождения ! 21 февраля 2013 четверг




   Наверх