|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Как корректно завершить программу |
|
Как корректно завершить программу
|
Пользователь Сообщения: 135 |
Профиль | Отправить PM | Цитировать Как корректно завершить программу из глубоко вложенной функции.
exit(); - Вызывает деструкторы только для глобальных объектов. Деструкторы для локальных(автоматических) объектов не вызываются! Вызывать все деструторы вручную (как рекомендует MSDN) очень гиморно, А вернее просто невозможно. (функция глубоко вложенная) |
|
Отправлено: 02:25, 27-01-2004 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать ИМХО, не стоит пользоваться exit() в C++ . Это, извините, признак плохого тона. Все функции (процедуры), вплоть до той самой, которая требует немедленного выхода из программы, должны проверять состояние (возвращаемое значение) вызываемых фонкций и, в свою очередь, сообщать (немедленным возвратом с кодом ошибки) об этом тем, кто вызвал их самих. При этом деструкторы классов сработают тут же , а о "локальных объектоах" надо позаботиться.
Но это мое личное мнение. Если так ломает проверять состояние всех функций, просто делай exit() и не заморачивайся. Память, выделенная приложению, будет очищена и возвращена операционной системе. Так что не играет никакой роли, сработали деструкторы, не сработали... Пользователь все равно увидит сообщение об ошибке, а твое оно или системное, его уже волновать не будет. Конечно, не все так просто: 1. В ОС, не поддерживающих разделение памяти между процессами (DOS), память будет "утекать". 2. Файлы, открытые объектом, желательно закрывать, иначе могут возникнуть файлы, которые "система не может удалить" (Win95). 3. Динамическая библиотека, в пределах которой сделан выход, уронит все приложение (*nix). Поэтому, ИМХО, стоит подумать еще раз, а так ли уж и "невозможно" вернуться и вызвать деструкторы? |
Отправлено: 09:36, 27-01-2004 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать |
------- Отправлено: 17:07, 27-01-2004 | #3 |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Цитата:
И элегантные. Возможно это придет со временем. Всем спасибо. |
|
Отправлено: 00:43, 29-01-2004 | #4 |
Ветеран Сообщения: 1180
|
Профиль | Отправить 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 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать pva
Цитата:
|
|
Отправлено: 13:01, 02-04-2004 | #6 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать hasherfrog
Ты полностью прав! И в первом и во втором посте! [s]Исправлено: Prisoner, 7:49 3-04-2004[/s] |
Отправлено: 13:59, 02-04-2004 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Разное - Как корректно удалить ОС? | 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 |
|