2011-08-07 76 views
5

是有一些方法来运行终止代码,不管是什么样的终止(异常,正常,未捕获的异常等)? 我知道它实际上可能在Java中,但它甚至可能在C++中?我假设一个Windows环境。关闭挂钩C++

+2

它是不可能在Java中任 - 不管语言的所有进程不能赶上Linux(和Windows上的等效)信号-9或当信号到达 – Soren

+0

由于@Drake建议运行任何代码,我会去[的atexit](http://www.cplusplus.com/reference/cstdlib/atexit/)。 –

回答

5

否 - 如果有人调用TerminateProcess,你的进程将没有进一步的告别破坏,(尤其是)没有任何机会,在运行任何代码关闭过程。来解决这个问题

+1

这是正确的答案;然而正如其他一些答案所指出的那样,你可以使用'atexit()'设置一个退出处理程序,并且你可以使用'signal()'来捕获大多数信号 - 但是如果有人强迫终止,你永远不会采取任何行动将杀-9在Linux和信号9是抓不到) – Soren

+0

谢谢你,其实我是怕的answere – Paranaix

+0

也:断言(),中止(),终止() –

2

对于正常闭合applciation我建议

atexit() 
1

的一个好方法是使用C++ RAII成语,其在此是指清理操作可以放置在对象的析构函数,即

class ShutdownHook { 
    ~ShutdownHook() { 
    // exit handler code 
    } 
}; 

int main() { 
    ShutdownHook h; 
    //... 
} 

参见ACE库Object Lifetime Manager。在链接的文档中,他们也讨论了atexit函数。

+0

我在上文中假设的出口是“正常“,即不通过例如'退出()'呼叫,或由于分段故障等。 –

+1

小心。这不能保证工作。如果一个异常转义了main(),那么在实现中定义了堆栈是否展开。因此,要保证这个工作,你必须捕获main()中的所有异常(将你的代码放在try块中)。你不需要做任何事情,只需重新抛出异常后的字眼。 –

0

不为任何类型的终止;有些信号被设计为不能被处理,比如Linux上的KILL。

这些信号被设计用来终止占用了所有内存或CPU,或其他一些资源的程序,并已离开的状态,使得它难以运行的处理函数的计算机。