Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Освобождение ресурса в finally


Страницы:   1 2 ... 24 25 26 27 28 29 30 31 32 33

Arinyshka ©   (2008-04-23 12:17:00) 

Не подскажете еще один момент:
Есть процедура, выглядит примерно так

procedure TSetPayFrm.BtnAddImageClick(Sender: TObject);
var  TempBitmap:TBitmap;
begin
if not(opendialog1.Execute) then  exit;
try
 TempBitmap  := TBitmap.Create;
 TempBitmap.LoadFromFile(OpenDialog1.FileName);
finally
TempBitmap.Free;
end;
end;

На освобождение  TempBitmap.Free; выдает варнинг
[Warning] uSetPaymentMain.pas(313): Variable 'TempBitmap' might not have been initialized
Не смертельно, но непонятно... почему варнинг? При изменениии условия и включении всей конструкции в один блок begin..end ситуация не менялась.


ЮЮ   (2008-04-24 12:26:00) [581]

> [66] ZENsan ©   (24.04.08 12:19)

> finally
> Free AndNil(Obj1);
> Free AndNil(Obj2);
> end;


если Obj1 и Obj2 локальные, то нет смфсла в их обNilениее в finally, если «глобальные», т.е. поля объекта, то нет смысла в обNilениее до try.


ZENsan   (2008-04-24 12:26:00) [582]

Constructor i Destructor - единственные класс методы до реализации класс методов в делфи начиная по моему с 2005-ого..


ZENsan   (2008-04-24 12:23:00) [583]

"Во первых это статический приватный метод, не классовый.)" - в делфи это "class procedure/function". (wait)


ZENsan   (2008-04-24 12:22:00) [584]

{RASkov} - :) это ты круто :)


ZENsan   (2008-04-24 12:21:00) [585]

const
 Obj: Tobj = nil;

ми про ето не говорим...

Поумничать - это хорошо конечно..


{RASkov}   (2008-04-24 12:20:00) [586]

> [63] ZENsan ©   (24.04.08 12:10)
> Согласен... Фрии - class procedure.

Во первых это статический приватный метод, не классовый.)
Во вторых
> предпочитаю 7 раз отмерить - один раз отрезать.

Тоже не есть верно. Зачем лишние расходы? Можно же еще и так делать и тоже будет верно:
if not Assigned(Ojb) and Obj=nil and (Not assigned(Obj) and Obj=nil) then Obj.Free;
:)


ZENsan   (2008-04-24 12:19:00) [587]

Спасибо за справочку {RASkov}, тоесть теперй код такой должен быть:


Obj1 := nil;
Obj2 := nil;
try
Obj1 := TObj1.Create;
Obj2 := TObj2.Create;
...
finally
 FreeAndNil(Obj1);
 FreeAndNil(Obj2);
end;


Ну ваще красота... но я всё же ставлю проверку (ну моразматик я, да :) )..


Плохиш   (2008-04-24 12:18:00) [588]


> ZENsan ©   (24.04.08 12:11) [64]
> Параметры функций/процедур не инициализируются автоматически
> в Делфи

Чем дальше в лес, тем толще партизаны...

PS. "Параметры функций/процедур" обычно передаются в эти функции/процедуры, если конечно для них не заданы значения по умолчанию.

PPS. А основы используемого языка программирования всё-таки почитай.


ZENsan   (2008-04-24 12:11:00) [589]

Параметры функций/процедур не инициализируются автоматически в Делфи


ZENsan   (2008-04-24 12:10:00) [590]

Согласен... Фрии - class procedure.
Но нил я присваиваю именно птоому что объекты когда они локальные в процедурах и функциях могут иметь рандом значения из стека. Поэтому без Obj1 := nil; лучше не жить...

А про фрии, никогда не знал - не полагался никогда на это. предпочитаю 7 раз отмерить - один раз отрезать.


{RASkov}   (2008-04-24 12:09:00) [591]

> [60] ZENsan ©   (24.04.08 12:01)
> nil или неинициализирован

Дело в том, что это разные вещи и приравнивание переменной Obj1 к nil - тажа самая инициализация по сути.


{RASkov}   (2008-04-24 12:03:00) [592]

> [60] ZENsan ©   (24.04.08 12:01)

Проверь:
var B: TObject;
begin
 B:=nil;
 B.Free;
end;


нет никаких АВ :)


ZENsan   (2008-04-24 12:01:00) [593]

Ну ка ну ка чё там за фишка про Фрии..
Если вызывать Obj1.Free, когда Obj1 = nil или неинициализирован (локальная переменная в процедуре функции) - то будет исключение 100%...


ZENsan   (2008-04-24 11:59:00) [594]

А я не тебе ;)


ANB   (2008-04-24 11:58:00) [595]


> ZENsan ©   (24.04.08 11:55) [54]
> Мой способ вообще был нормальный:
>
> Obj1 := nil;
> Obj2 := nil;
> try
>  Obj1 := TObj1.Create;
>  Obj2 := TObj2.Create;
>  ...
> finally
>  if Assigned(Obj1) then
>    FreeAndNil(Obj1);
>  if Assigned(Obj2) then
>    FreeAndNil(Obj2);
> end;

А я не тебе и писал :).
Тем более твой код - почти такой же как и мой. Кистате, я года 3 назад так же писал, пока Саша Просторов не предложил мне взглянуть на реализацию Фрии :).


ZENsan   (2008-04-24 11:57:00) [596]

"Не факт. Смотри:
Obj1:=TObj.Create;
if Assigned(Obj1) then Obj1.Free;
if Assigned(Obj1) then Obj1.Free;" - ето не мой код...


ZENsan   (2008-04-24 11:56:00) [597]

Если исключение будет в сосздании второго объекта...????

Тогда ваша прого просто улетит...


ZENsan   (2008-04-24 11:55:00) [598]

Мой способ вообще был нормальный:

Obj1 := nil;
Obj2 := nil;
try
 Obj1 := TObj1.Create;
 Obj2 := TObj2.Create;
 ...
finally
 if Assigned(Obj1) then
   FreeAndNil(Obj1);
 if Assigned(Obj2) then
   FreeAndNil(Obj2);
end;


ЮЮ   (2008-04-24 11:55:00) [599]

> Ну а такой код-то от чего появился вдруг?

Он появился от того, что появилась проверка if Assigned(Obj1) которая абсолютно ничего не дает.
Что с не, что без неё Obj1.Free сработает абсолютно одинаково.


ANB   (2008-04-24 11:53:00) [600]


> Arinyshka   (24.04.08 11:28) [42]
> А мне велено почитать про секцию  finalization. Может, так
> действительно проще?
> инициализировать и освободить в соотв секциях...
> Из советов мне понятен вариант с проверкой:
> if Assigned(Obj1) then>   Obj1.Free;i
> тогда я никого не попытаюсь освободить дважды


Выделенное - совершенно лишний код. Фрее и так внутри проверяет, что ссылка на объект не равна NIL.


Страницы:   1 2 ... 24 25 26 27 28 29 30 31 32 33

Наверх

Титульная страница Поиск, карта сайта Написать письмо