![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как избежать варинига при создании объекта в try finally [D6, WinXP]
novill © (2006-05-25 11:06:00)если удаление объекта происходит в блоке finally, то компилятор пишет предупреждение, что объект может быть не создан.
Мне строчка эта сильно не нравится, хотя понимаю, что ничего страшного. Как надо написать чтобы ее не было?
вот пример кода
var
SD:TSaveDialog;
begin
try
SD:=TSaveDialog.Create(MyForm);
SD.InitialDir:=GetCurrentDir;
SD.Filter:='Excel files (*.xls)|*.XLS';
if SD.Execute then filename:=SD.FileName;
finally
SD.Free;
end;
Компилятор пишет "Variable 'SD' might not have been initialized"
Leonid Troyanovsky (2006-05-25 22:21:00) [21]
> Loginov Dmitry © (25.05.06 20:42) [31]
> Сорри, а причем здесь FreeAndNil()?
Это примерно тот же костыль как и SD := nil.
Т.е., вид сзаду.
--
Regards, LVT.
Loginov Dmitry (2006-05-25 20:42:00) [22]Сорри, а причем здесь FreeAndNil()?
ANB (2006-05-25 20:28:00) [23]
>
> obj1 := TMyClass1.Create;
> obj2 := TMyClass2.Create; // На этом операторе ловит исключение и получаем утечку памяти.
> try
> .....
> finally
> ob1.Free;
> obj2.Free;
> end;
ЗЫ. FreeAndNil рулит.
jack128 (2006-05-25 18:57:00) [24]StriderMan © (25.05.06 18:46) [28]
если в конструкторе вываливается Exception это совсем не гуд
это абсолютно нормальная ситуация.
StriderMan (2006-05-25 18:46:00) [25]
> вылет obj2 говорит в первую очередь об ошибках проектирования
конечно, если в конструкторе вываливается Exception это совсем не гуд, однако в некоторых случаях такое может иметь место, особенно если в конструктор передаются какие-то параметры, например тот же TBlobStream.
Zz_ (2006-05-25 18:26:00) [26]Почитайте про задачу Каргилла, вьюноша ...
@BraIN (2006-05-25 18:24:00) [27]В реальной ситуации вылет obj2 говорит в первую очередь об ошибках проектирования. А все эти obj := nil — танцы с бубном. Потому и самообман.
Мое мнение.
Zz_ (2006-05-25 18:14:00) [28]Если obj2 := TMyClass2.Create - вылетает, то ой
@BraIN (2006-05-25 17:58:00) [29]
> очень удобная конструкция, когда создается несколько объектов,
> которые потом надо разрушить
>
> например:
>
> obj1 := nil;
> obj2 := nil;
> try
> obj1 := TMyClass1.Create;
> obj2 := TMyClass2.Create;
> .....
> finally
> ob1.Free;
> obj2.Free;
> end;
Честно говоря, я в недоумении (мягко говоря)..Просто поинтересуюсь: почему не так?
obj1 := TMyClass1.Create;
obj2 := TMyClass2.Create;
try
.....
finally
ob1.Free;
obj2.Free;
end;
StriderMan (2006-05-25 17:18:00) [30]
> но и об Exception из Create твой try забудет.
а вот и не забудет
Exception, появившийся между try .. finally после выполнения finally..end вылезет наружу. можете проверить.
StriderMan (2006-05-25 17:14:00) [31]
> Loginov Dmitry © (25.05.06 11:47) [2]
> SD := nil; перед try finally
совершенно правильный код
вызов FREE у объекта = nil не вызовет ошибку
очень удобная конструкция, когда создается несколько объектов, которые потом надо разрушить
например:
obj1 := nil;
obj2 := nil;
try
obj1 := TMyClass1.Create;
obj2 := TMyClass2.Create;
.....
finally
ob1.Free;
obj2.Free;
end;
вобщем-то единственный способ избежать еще одного try..finally. А если объектов 3? а если 10?
Постоянно таким кодом пишу
если один объект, то объект логичнее создать перед try
Сергей М. (2006-05-25 13:57:00) [32]
> Если в Create возникнет Exception, то управление сразу же
> перейдет в мой блок finally
Угу ..а там SD = nil.
Лишняя проверка на SD=nil, заведомо возвращающая True - это лишнее бестолково затраченное время.
Loginov Dmitry (2006-05-25 13:51:00) [33]evvcom © (25.05.06 13:38) [16]
Free AV не возбудит, но и об Exception из Create твой try забудет. Тут собака и порылась.
Это почему? Если в Create возникнет Exception, то управление сразу же перейдет в мой блок finally. Здесь все чисто, имхо.
Игорь Шевченко © (25.05.06 13:43) [17]
При заданной наперед функциональности программа должна содержать минимальное количество удобочитаемых строк.
Я - за! Убедили! С таким аргиментом не поспоришь :)
evvcom (2006-05-25 13:47:00) [34]А... Да, да. Согласен.
Игорь Шевченко (2006-05-25 13:45:00) [35]evvcom © (25.05.06 13:38) [16]
> но и об Exception из Create твой try забудет
Не забудет. Там стоит finally, который подразумевает выполнение действий в своей секции и дальнейшее возбуждение Exception'а.
Игорь Шевченко (2006-05-25 13:43:00) [36]Loginov Dmitry © (25.05.06 13:28) [14]
> Лучше (если сможете) укажите в чем я не прав
При заданной наперед функциональности программа должна содержать минимальное количество удобочитаемых строк.
evvcom (2006-05-25 13:38:00) [37]
> Лучше (если сможете) укажите в чем я не прав
Ты подразумеваешь, что объект будет всегда создан. А вдруг случай [9]? Ну да, Free AV не возбудит, но и об Exception из Create твой try забудет. Тут собака и порылась. Приложение будет спокойно выполняться, думая, что все хорошо, пользователь волосы на ... рвать, материть программиста: "Почему такая фигня? Жму на кнопку, а диалог ни гу-гу!" и насиловать клавиатуру и мышку. А ты говоришь! Вот тебе и пальцы.
Zz_ (2006-05-25 13:30:00) [38]В связи с отсутствием RAII
try
try
try
try
try
по - моему хуже, чем
:= nil;
:= nil;
:= nil;
try
create
create
create
finally
free
free
free
Я не прав ?
Loginov Dmitry (2006-05-25 13:28:00) [39]Игорь Шевченко © (25.05.06 13:23) [12]
Пальцы жалко. И глаза.
И вы туда же? Пальцы на то и пальцы, нечего их жалеть. Лучше (если сможете) укажите в чем я не прав, тогда я хоть смогу сказать пару слов в свою защиту :)))
Amoeba (2006-05-25 13:27:00) [40]
> Loginov Dmitry © (25.05.06 13:11) [11]
> И еще (для) [6], [7]
>
> Не стоит быть такими категоричными. Предложенный мною способ
> в ран-тайме не будет НИЧЕМ отличаться от "правильного способа".
> Если объект не будет создан, то метод Free выполниться
> НОРМАЛЬНО. Так что не к чему тут разводить
Все-же следует делать правильно, а не по твоему способу, и не запихивать создание объекта внутрь try...finally. Не стоит прививать начинающим плохой стиль программирования.