Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как корректно завершить программу (http://forum.oszone.net/showthread.php?t=29859)

bilytur 27-01-2004 02:25 206080

Как корректно завершить программу из глубоко вложенной функции.
exit(); - Вызывает деструкторы только для глобальных объектов.
Деструкторы для локальных(автоматических) объектов не вызываются!
Вызывать все деструторы вручную (как рекомендует MSDN) очень гиморно,
А вернее просто невозможно. (функция глубоко вложенная)

hasherfrog 27-01-2004 09:36 206081

ИМХО, не стоит пользоваться exit() в C++ . Это, извините, признак плохого тона. Все функции (процедуры), вплоть до той самой, которая требует немедленного выхода из программы, должны проверять состояние (возвращаемое значение)  вызываемых фонкций и, в свою очередь, сообщать (немедленным возвратом с кодом ошибки) об этом тем, кто вызвал их самих. При этом деструкторы классов сработают тут же , а о "локальных объектоах" надо позаботиться.
Но это  мое личное мнение. Если так ломает проверять состояние всех функций, просто делай exit() и не заморачивайся. Память, выделенная приложению, будет очищена и возвращена операционной системе. Так что не играет никакой роли, сработали деструкторы, не сработали... Пользователь все равно увидит сообщение об ошибке, а твое оно или системное, его уже волновать не будет.
Конечно, не все так просто:
1. В ОС, не поддерживающих разделение памяти между процессами (DOS), память будет "утекать".
2. Файлы, открытые объектом, желательно закрывать, иначе могут возникнуть файлы, которые "система не может удалить" (Win95).
3. Динамическая библиотека, в пределах которой сделан выход, уронит все приложение  (*nix).
Поэтому, ИМХО, стоит подумать еще раз, а так ли уж и "невозможно" вернуться и вызвать деструкторы?

ivank 27-01-2004 17:07 206082

bilytur
Может проще кинуть исключение, которое будет ловиться только main'ом? Раскрутиться стэк и всё будет хорошо. Это при условии, что нет выражений типа
Код:

try
{
    //...
}
catch (...)
{
    //и здесь нету дальнейшего throw;
}

Но программма, в которое встречается подобное - заведомо плохая программа.

bilytur 29-01-2004 00:43 206083

Цитата:

Но программма, в которое встречается подобное - заведомо плохая программа.
Хочу писать хорошие программы :)
И элегантные.
Возможно это придет со временем.
Всем спасибо.

pva 02-04-2004 12:27 206084

Если исключения в C++ используются только в исключительных ситуациях (например 1/1 000 000)  и помогают написать понятную программу, то это признак мастерства. Например:

class MyApp {
public:
 class MyExit {};
 void do_something() throw MyExit
 {
    ...
     if (too_bad_to_proceed_) throw MyExit();
    ...
 }
}

В main можно даже не ловить это исключение. Правильные компиляторы делают так, что оно не приводит к обрушению системы (в rtlInit... стоит try...catch) Кстати, такое решение называется красивым в книге Страуструпа.

hasherfrog 02-04-2004 13:01 206085

pva
Цитата:

то это признак мастерства
Некоторые среды программирования, например QT, вообще не предусматривают try/catch/trow. Их использование  в ряде случаев приводит к Segmentation faults'ам при выходе. Объяснять как и почему, не буду, это только для использующих QT, но сам факт имеет место быть.

DYURIK 02-04-2004 13:59 206086

hasherfrog
Ты полностью прав! И в первом и во втором посте!

[s]Исправлено: Prisoner, 7:49 3-04-2004[/s]


Время: 09:33.

Время: 09:33.
© OSzone.net 2001-