Windows Ctrl-C - 在命令行应用程序中清理本地堆栈对象
Posted
技术标签:
【中文标题】Windows Ctrl-C - 在命令行应用程序中清理本地堆栈对象【英文标题】:Windows Ctrl-C - Cleaning up local stack objects in command line app 【发布时间】:2011-09-19 17:51:25 【问题描述】:我正在编写一个控制台应用程序 Windows,它在主线程中创建一些对象并将这些对象启动到一个循环中,仅在用户使用 Ctrl-C 中断时退出。
现在,我已经阅读了一些关于如何编写适当的中断处理程序的文章:http://msdn.microsoft.com/en-us/library/ms685049%28VS.85%29.aspx,但我仍然对一件事感到困惑。似乎中断处理程序为本地对象清理留下了有限的范围。例如,如果我有这样的处理程序:
BOOL CtrlHandler ( DWORD fdwCtrlType )
... handle Ctrl-C
我的主要看起来像这样:
int main()
DBClient db;
DataPuller p;
while (true)
... do stuff until Ctrl-C comes in
即使我抓住了 Ctrl-C,似乎也没有办法在不将它们声明为全局变量的情况下对变量 db 和 p 进行适当的清理,我通常会远离它们。
有没有更好的方法来做到这一点,还是我遗漏了一些明显的东西?谢谢。
【问题讨论】:
为什么你需要清理任何东西 - 这些是自动变量,当你退出函数范围时它们应该清理自己。 @Kerrek:Ctrl-C 向进程发送 SIGINT 信号。如果不处理,这会导致应用程序中止(不从信号处理程序返回)。因此不会清理自动变量。 @Tux:我认为 OP 已经安装了一个信号处理程序,它只会设置一个适当的退出条件。 【参考方案1】:您在条件变量上创建循环。
当您收到 ctrl-C (SIGINT) 时,您将条件变量设置为 false 并返回。 然后循环将正常退出。
bool finished = false;
int main()
DBClient db;
DataPuller p;
while (!finished)
// ... do stuff until Ctrl-C comes in
// Signal handler or Control handler on windows
// Set finished = true.
【讨论】:
【参考方案2】:我认为如果没有至少一个全局变量就无法做到这一点。但是,我认为您只需要一个:
BOOL is_shutting_down = false;
BOOL CtrlHandler ( DWORD fdwCtrlType )
switch( fdwCtrlType )
// Handle the CTRL-C signal.
case CTRL_C_EVENT:
is_shutting_down = true;
return( TRUE );
int main()
DBClient db;
DataPuller p;
while (is_shutting_down == false)
... do stuff until Ctrl-C comes in
//objects clean themselves automatically.
全局“is_shutting_down”的一个副作用是,如果它设置为 true,则析构函数不需要释放内存,因为操作系统会自动回收所有内存,如果您有大量的小分配。
【讨论】:
以上是关于Windows Ctrl-C - 在命令行应用程序中清理本地堆栈对象的主要内容,如果未能解决你的问题,请参考以下文章