Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Как корректно завершить программу

Ответить
Настройки темы
Как корректно завершить программу

Пользователь


Сообщения: 135
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 02:25, 27-01-2004

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:36, 27-01-2004 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


bilytur
Может проще кинуть исключение, которое будет ловиться только main'ом? Раскрутиться стэк и всё будет хорошо. Это при условии, что нет выражений типа
Код: Выделить весь код
try
{
    //...
}
catch (...)
{
    //и здесь нету дальнейшего throw;
}
Но программма, в которое встречается подобное - заведомо плохая программа.

-------
http://ivank.ru


Отправлено: 17:07, 27-01-2004 | #3


Пользователь


Сообщения: 135
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 00:43, 29-01-2004 | #4

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Если исключения в 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) Кстати, такое решение называется красивым в книге Страуструпа.

Отправлено: 12:27, 02-04-2004 | #5


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:01, 02-04-2004 | #6


Пользователь


Сообщения: 61
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 13:59, 02-04-2004 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Как корректно завершить программу

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Как корректно удалить ОС? st031 Microsoft Windows 2000/XP 7 07-07-2008 16:54
как завершить процесс в вин98 slaine Microsoft Windows 95/98/Me (архив) 2 29-12-2006 15:00
Как завершить приложение, которого нет в списке Ctrl-Alt-Del? Do Not Disturb Microsoft Windows 95/98/Me (архив) 8 21-06-2006 10:18
Как корректно удалить Windows XP? mtsoy Хочу все знать 7 05-11-2003 19:04




 
Переход