![]() |
Как корректно завершить программу из глубоко вложенной функции.
exit(); - Вызывает деструкторы только для глобальных объектов. Деструкторы для локальных(автоматических) объектов не вызываются! Вызывать все деструторы вручную (как рекомендует MSDN) очень гиморно, А вернее просто невозможно. (функция глубоко вложенная) |
ИМХО, не стоит пользоваться exit() в C++ . Это, извините, признак плохого тона. Все функции (процедуры), вплоть до той самой, которая требует немедленного выхода из программы, должны проверять состояние (возвращаемое значение) вызываемых фонкций и, в свою очередь, сообщать (немедленным возвратом с кодом ошибки) об этом тем, кто вызвал их самих. При этом деструкторы классов сработают тут же , а о "локальных объектоах" надо позаботиться.
Но это мое личное мнение. Если так ломает проверять состояние всех функций, просто делай exit() и не заморачивайся. Память, выделенная приложению, будет очищена и возвращена операционной системе. Так что не играет никакой роли, сработали деструкторы, не сработали... Пользователь все равно увидит сообщение об ошибке, а твое оно или системное, его уже волновать не будет. Конечно, не все так просто: 1. В ОС, не поддерживающих разделение памяти между процессами (DOS), память будет "утекать". 2. Файлы, открытые объектом, желательно закрывать, иначе могут возникнуть файлы, которые "система не может удалить" (Win95). 3. Динамическая библиотека, в пределах которой сделан выход, уронит все приложение (*nix). Поэтому, ИМХО, стоит подумать еще раз, а так ли уж и "невозможно" вернуться и вызвать деструкторы? |
bilytur
Может проще кинуть исключение, которое будет ловиться только main'ом? Раскрутиться стэк и всё будет хорошо. Это при условии, что нет выражений типа Код:
try |
Цитата:
И элегантные. Возможно это придет со временем. Всем спасибо. |
Если исключения в 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) Кстати, такое решение называется красивым в книге Страуструпа. |
pva
Цитата:
|
hasherfrog
Ты полностью прав! И в первом и во втором посте! [s]Исправлено: Prisoner, 7:49 3-04-2004[/s] |
Время: 09:33. |
Время: 09:33.
© OSzone.net 2001-