【发布时间】: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 时实际停止。我就是不知道为什么。