Главная страница
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.007 c
15-1361287987
TStas
2013-02-19 19:33
2013.07.07
Как редактировать анкету?


15-1361503988
Slider007
2013-02-22 07:33
2013.07.07
Найди кота


15-1361355483
валера
2013-02-20 14:18
2013.07.07
Помогите с RegExp ом


8-1232118558
KiLLiR
2009-01-16 18:09
2013.07.07
Масштабирование картинки в окне фиксированного размера


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