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

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

Как избежать варинига при создании объекта в try finally [D6, WinXP]


Страницы:   1 2 3

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. Не стоит прививать начинающим плохой стиль программирования.


Страницы:   1 2 3

Наверх

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