![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освобождение ресурса в finally
Arinyshka © (2008-04-23 12:17:00)
Страницы: < 1 2 ... 24 25 26 27 28 29 30 31 32 33 >
Не подскажете еще один момент:
Есть процедура, выглядит примерно так
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.