【问题标题】:Exiting from C++ Console Program退出 C++ 控制台程序
【发布时间】:2010-02-16 06:10:34
【问题描述】:

我目前有一个具有以下基本结构的程序

主要功能 -- 向用户显示菜单选项 -- 通过将用户输入传递给第二个函数 (input_validator) 来验证用户输入 -- 如果用户选择选项 1,则运行函数 1,等等

函数1、2、3等 -- 从用户请求输入,然后由 input_validator 验证 -- 如果 input_validator 返回 true,我们知道输入是好的

这是我的问题。我想允许用户在程序中的任何时候通过键入“0”退出。我计划用 input_validator 中的一些基本代码来做这个(如果 input = 0 等)。

这看起来很简单,但有人告诉我,使用 quit() 会导致某些资源永远不会被释放 / 等等。我也不能简单地做一个“休息”——它会导致我的程序简单地返回到主函数。

有什么想法吗?

【问题讨论】:

标签: c++ function validation quit


【解决方案1】:

一种可能性是通过抛出您在 main 中捕获的异常来实现,当您捕获它时,您退出程序。抛出异常的好处是它可以让析构函数运行以清理已创建的对象,如果您直接从其他地方退出(例如,使用exit()),则不会发生这种情况。

【讨论】:

  • 我已经有一段时间没有用 C++ 编程了,你知道关于异常的好教程吗?
  • @BSchlinker:关于异常的最佳教程(尽管可能比您立即需要的更详细)可能是 Herb Sutter 撰写的 Exceptional C++。这是对他的旧 Guru of the Week Usenet 帖子的扩展材料,可在 gotw.ca 获取。
【解决方案2】:

exit()

正常终止进程, 执行定期清理 终止进程。

首先,所有注册的函数 对 atexit 的调用在 他们的注册顺序相反。 然后,关闭所有流,并且 临时文件被删除,最后 控制权返回给主机 环境。

【讨论】:

  • 这告诉您实际释放的内容,而不是可能留下的内容:命名管道,应该在退出之前删除的非临时文件(即某些进程将 pid 存储在文件中在 linux 中,该文件不是临时文件,但应在程序退出时删除)......在 OP 程序中可能不是问题,但仍然。
【解决方案3】:

很长一段时间以来,任何一种主流操作系统都不是这样。操作系统确保所有内核资源都被释放,即使程序没有明确这样做。从代码中的任何位置调用 abort() 或 exit() 都可以。

【讨论】:

  • 一些移动操作系统在处理这个问题时仍然存在问题,并且存在操作系统无法知道需要释放的资源。如果程序创建了命名管道,或者持续时间应该只是程序生命周期的文件(即某些 linux 应用程序中的 pid 文件),备份文件(即某些编辑器和文字处理器中的文件)...
【解决方案4】:

exit(int exitCode) - 在 stdlib.h / cstdlib 中定义 - 你可能想要 exit(0); // 正常终止。

【讨论】:

    【解决方案5】:

    exit() 不会调用您的析构函数,因此您可能需要考虑使用异常处理程序。

    如果您有打开但未刷新的文件,操作系统将关闭文件句柄,但不会刷新任何未写入的数据。

    【讨论】:

      【解决方案6】:

      您必须设计您的菜单系统,以便可以将状态传递回之前的方法,展开直到执行main 函数中的代码。 后退上一屏按钮也存在类似问题。

      退一步看看大图,展开技术看起来非常类似于 C++ 异常处理策略。我建议对不遵循正常执行流程的情况使用exceptions,例如主菜单上一个菜单。

      试试看。

      【讨论】:

        猜你喜欢
        • 2014-02-17
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        • 2014-09-04
        • 1970-01-01
        • 1970-01-01
        • 2016-07-27
        • 2010-10-03
        相关资源
        最近更新 更多