Выход из консольной программы C ++ - PullRequest
2 голосов
/ 16 февраля 2010

В настоящее время у меня есть программа, которая имеет следующую базовую структуру

основная функция - отображает пункты меню для пользователя - проверяет вводимые пользователем данные, передавая их второй функции (input_validator) - если пользователь выберет опцию 1, запустите функцию 1 и т. д.

function1,2,3, и т.д. - ввод запрашивается у пользователя и затем проверяется input_validator - если input_validator возвращает true, мы знаем, что вход хорош

Вот моя проблема. Я хочу, чтобы пользователь мог выйти в любой точке программы, набрав «0». Я планировал сделать это с некоторым базовым кодом в input_validator (если input = 0 и т. Д.).

Это может показаться простым, но мне сказали, что использование quit () приведет к тому, что некоторые ресурсы никогда не будут освобождены / и т.д. Я не могу просто сделать 'break' - это приведет к тому, что моя программа просто вернется к основной функции.

Есть идеи?

Ответы [ 6 ]

4 голосов
/ 16 февраля 2010

Одна из возможностей - сделать это, выдав исключение, которое вы перехватываете в main, и когда вы его перехватываете, вы выходите из программы. Хорошим смыслом исключения является то, что оно позволяет деструкторам запускать для очистки созданных объектов, что не произойдет, если вы выйдете напрямую из другого места (например, с помощью exit()).

4 голосов
/ 16 февраля 2010

exit()

нормально завершает процесс, выполняя регулярную очистку для завершающие процессы.

Во-первых, все функции зарегистрированы вызовы atexit выполняются в обратный порядок их регистрации. Затем все потоки закрыты и временные файлы удалены, и, наконец, управление возвращается хозяину окружающая среда.

3 голосов
/ 16 февраля 2010

Это не было верно ни для какой основной операционной системы в течение долгого времени. ОС гарантирует, что все ресурсы ядра будут освобождены, даже если программа явно не сделала этого. Вызов abort () или exit () из любого места в вашем коде - это нормально.

1 голос
/ 16 февраля 2010

exit (int exitCode) - определено в stdlib.h / cstdlib - возможно, вы захотите выйти (0);// нормальное завершение.

0 голосов
/ 16 февраля 2010

Вы должны спроектировать свою систему меню так, чтобы статус мог быть возвращен назад к предыдущему методу, раскручиваясь до тех пор, пока не будет выполнен код в функции main. Аналогичные проблемы относятся к назад или предыдущему экрану кнопок.

Делая шаг назад и глядя на Big Picture , метод разматывания выглядит очень похоже на стратегию обработки исключений C ++. Я предлагаю использовать исключения для случаев, которые не следуют за нормальным потоком выполнения, таким как главное меню и предыдущее меню .

Попробуйте.

0 голосов
/ 16 февраля 2010

exit () не будет вызывать ваши деструкторы, поэтому вы можете использовать вместо этого обработчик исключений.

Если у вас есть такие вещи, как открытые, но незапущенные файлы, ОС закроет дескрипторы файлов, но не сбросит все неписанные данные.

...