【问题标题】:std::atexit() doesn't work if std::cin has been used in the code如果代码中使用了 std::cin,则 std::atexit() 不起作用
【发布时间】:2019-11-24 21:14:01
【问题描述】:

几天前我开始使用 C++,所以可能是一个非常业余和愚蠢的问题:

当我的应用程序关闭时,std::atexit() 中提供的函数会被调用。很高兴。但是,一旦我使用 std::cin 从用户端获取输入(至少一次),该函数就不会被调用。

这是一个控制台应用程序。

编辑:我想在程序等待输入时仍然执行我的 void Close() 函数。但我只能在我的程序不等待输入的情况下实现这一点。我认为这可能不是正确的方法,我的程序启动 Apache Web 服务器和 Mysql 数据库服务器(使用 ShellExecuteEx()),当我的应用程序停止时,我也会停止它们。

我也尝试过 std::set_terminate()。

// This is super good, everything works as expected

#include <iostream>
#include <string>

void Close()
{
    // Code I need to run when program closes.
}

int main()
{
    std::atexit(Close);

    // Some code...

    return 0;
}

但是,如果我等待用户输入,则不会调用“void Close()”。

#include <iostream>
#include <string>

void Close()
{
    // Code I need to run when program closes.
}

int main()
{
    std::atexit(Close);

    std::string example;
    std::cin >> example;

    return 0;
}

【问题讨论】:

  • 作为一个新的 C++ 用户,您可能不需要std::atexit。这是一个非常特殊的功能,只能在特定的极少数情况下使用。
  • 我的程序在运行时会启动 Apache Web 服务器和 Mysql。当我的程序关闭时,我会停止这些进程。哪个工作正常。你会说,我应该用另一种方法来停止这些进程吗? (我忘了加windows标签)
  • 一种方法是永远不要从任何函数调用exit,但始终确保有一个返回路径到main 函数,即使它必须通过(捕获)异常。然后在离开 main 函数之前“清理”。
  • 好吧,当您仍然不能 100% 确定标准输入的工作原理时,尝试和操作外部进程和内容可能还为时过早。但这当然只是我的看法。
  • 感谢您的 cmets!好吧,我刚刚为自己做了一个应用程序,它配置和启动 Apache 和 Mysql,然后为我配置 PHP。一切都很好,但我也有实现一些命令行解释的想法,我也成功地做到了。好吧,你知道吗,一切正常,只是我的应用程序进入后台而不是在我使用 std::cin 时实际停止。我就是不知道为什么。

标签: c++ windows


【解决方案1】:

但是,如果我等待用户输入,void Close() 将不会被调用。

确实如此,但这是我们想要的。在等待用户输入时,您的程序还没有关闭。只要用户确实提供了将被解析为example 字符串对象的输入,它就是 - 并且 this 是在调用 Close() 时。因此,在执行时,输入一些字符,回车,这会触发Close()

【讨论】:

  • 我明白了,谢谢。所以你说我不能在我的程序等待输入时触发某种“退出函数执行”?我在我的程序中启动了一些 Windows 进程,当我的程序关闭时我需要停止这些进程。
  • 不确定我是否明白,但通常没有,当函数等待输入时,您不能简单地从外部阻止它这样做。如果您必须处理多个子流程,请考虑为此目的使用库,我认为 Boost 可以提供帮助。
猜你喜欢
  • 2017-08-05
  • 1970-01-01
  • 2015-11-17
  • 2020-08-03
  • 2021-01-03
  • 2020-08-18
  • 2011-06-12
  • 2011-10-12
相关资源
最近更新 更多