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"


Игорь Шевченко   (2006-05-25 13:23:00) [41]


> Предложенный мною способ в ран-тайме не будет НИЧЕМ отличаться
> от "правильного способа".


Пальцы жалко. И глаза.


Loginov Dmitry   (2006-05-25 13:11:00) [42]

И еще (для) [6], [7]

Не стоит быть такими категоричными. Предложенный мною способ в ран-тайме не будет НИЧЕМ отличаться от "правильного способа". Если объект не будет создан, то метод Free выполниться НОРМАЛЬНО. Так что не к чему тут разводить ...


Kolan   (2006-05-25 13:09:00) [43]

А вот всякие ненужные варнинги такой способ убирает - это точно!
Ненужных Warning'ов небывает. :)


Сергей М.   (2006-05-25 12:50:00) [44]


> novill   (25.05.06 11:06)


> понимаю, что ничего страшного


Неправильно понимаешь. Именно о "страшном" предупреждает тебя компилятор.

Представь себе, что при выполнении строчки

SD:=TSaveDialog.Create(MyForm);

возникла искл.ситуация (по каким причинам - не важно).

В результате объект класса TSaveDialog не был создан, и в переменную SD не было ничего записано (при этом ее содержимое не определено)
Поскольку строчка, вызвавшая исключение, была включена в try-finally-блок, управление тут же будет передано в секцию finally этого блока, где ты пытаешься уничтожить несуществующийобъект, что практически 100%-но гарантирует возникновение нового исключения (AV).

Именно об этом тебя и предупреждает компилятор.


Loginov Dmitry   (2006-05-25 12:45:00) [45]

Самообмана тут нет (сам так ни разу не делал :)
А вот всякие ненужные варнинги такой способ убирает - это точно!


@BraIN   (2006-05-25 12:29:00) [46]


> Loginov Dmitry ©   (25.05.06 11:47) [2]
>
> SD := nil; перед try finally


Бред и самообман.


evvcom   (2006-05-25 12:25:00) [47]


> Затем, чтобы не было
> "Variable 'SD' might not have been initialized"

Гон или как там сейчас любят говорить? Баян?


Kolan   (2006-05-25 12:14:00) [48]

var
SD:TSaveDialog;
begin
SD:=TSaveDialog.Create(MyForm);
try
 ...
finally
SD.Free;
end;

В этом случае предупреждения нет. И этот вариант гораздо правильнее. А
SD := nil;
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;

Вообще смысла особого не имеет. Зачем давать такие советы?


Loginov Dmitry   (2006-05-25 11:55:00) [49]

Kolan ©   (25.05.06 11:48) [3]
Зачем?


Затем, чтобы не было
"Variable 'SD' might not have been initialized"


Kolan   (2006-05-25 11:48:00) [50]

Loginov Dmitry ©   (25.05.06 11:47) [2]
Зачем?
Сергей М. ©   (25.05.06 11:13) [1]
Это стандартная конструкция.


Loginov Dmitry   (2006-05-25 11:47:00) [51]

SD := nil; перед try finally


Сергей М.   (2006-05-25 11:13:00) [52]

var
SD:TSaveDialog;
begin
SD:=TSaveDialog.Create(MyForm);
try
  ...
finally
 SD.Free;
end;


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

Наверх

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