Выход из консольной программы C++

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

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

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

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

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

Есть идеи?


person BSchlinker    schedule 16.02.2010    source источник
comment
не используйте выход, используйте исключения, для получения дополнительной информации перейдите по этой ссылке. stackoverflow.com/questions/1116493/how -to-quit-ac-program/   -  person Narendra N    schedule 16.02.2010
comment
Я не согласен с теми, кто здесь рекомендует использовать исключения для управления потоком. См. stackoverflow.com/questions/729379/   -  person Chris Tonkinson    schedule 16.02.2010


Ответы (6)


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

person Jerry Coffin    schedule 16.02.2010
comment
Прошло некоторое время с тех пор, как я программировал на C++, знаете ли вы какие-нибудь хорошие учебники по исключениям? - person BSchlinker; 16.02.2010
comment
@BSchlinker: Вероятно, лучший учебник по исключениям (хотя, вероятно, более подробный, чем вам нужно немедленно) — это Exceptional C++, написанный Хербом Саттером. Это дополнение к материалам из его старых постов в Usenet «Гуру недели», доступных по адресу gotw.ca. - person Jerry Coffin; 16.02.2010

exit()

Завершает процесс в обычном режиме, выполняя обычную очистку завершающих процессов.

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

person Amber    schedule 16.02.2010
comment
Это говорит вам о том, что на самом деле освобождается обратно, но не о том, что может остаться: именованные каналы, невременные файлы, которые должны быть удалены перед выходом (т.е. некоторые процессы хранят pid в файле в linux, этот файл не является временным , но должен быть удален при выходе из программы)... Возможно, проблема не в ОП-программе, но все же. - person David Rodríguez - dribeas; 16.02.2010

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

person Hans Passant    schedule 16.02.2010
comment
Некоторые мобильные ОС до сих пор имеют проблемы с этим, и есть ресурсы, о которых ОС не может знать, что их нужно освободить. Если программа создала именованные каналы или файлы, продолжительность которых должна быть равна сроку жизни программы (например, файлы pid в некоторых приложениях Linux), файлы резервных копий (например, в некоторых редакторах и текстовых процессорах)... - person David Rodríguez - dribeas; 16.02.2010

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

person James    schedule 16.02.2010

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

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

person MarkR    schedule 16.02.2010

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

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

Попробуйте.

person Thomas Matthews    schedule 16.02.2010