我有一个 Windows C++ 控制台程序,如果我不调用ReleaseDriver()
在我的程序结束时,某些硬件会进入错误状态,并且在不重新启动的情况下无法再次使用。
我想确定一下ReleaseDriver()
即使程序异常退出,例如如果我点击Ctrl+C
或关闭控制台窗口。
我可以用signal()
创建一个信号处理程序SIGINT
。这工作正常,尽管当程序结束时它会弹出一个恼人的错误“发生未处理的 Win32 异常...”。
我不知道如何处理控制台窗口被关闭的情况,并且(更重要的是)我不知道如何处理由错误的内存访问等引起的异常。
谢谢你的帮助!
在Windows下,您可以通过调用创建未处理的异常过滤器设置未处理异常过滤器() http://msdn.microsoft.com/en-us/library/ms680634(VS.85).aspx。完成后,只要在应用程序中某处生成未处理的异常,就会调用您的处理程序。
您的处理程序可用于释放资源、生成转储文件(请参阅小型转储写转储 http://msdn.microsoft.com/en-us/library/ms680360(VS.85).aspx),或任何您需要确保完成的事情。
请注意,围绕如何编写异常处理函数存在许多“陷阱”。尤其:
- 您不能调用任何 CRT 函数,例如
new
- 您无法执行任何基于堆栈的分配
- 如果您在处理程序中执行任何导致异常的操作,Windows 将立即终止您的应用程序,并从其背部撕下骨头。您不再有机会优雅地关闭。
您可以调用许多 Windows API 函数。但你不能sprintf
, new
, delete
... 简而言之,如果它不是 WINAPI 函数,它可能不安全。
由于上述所有原因,建议将所有变量都放在处理函数中static
变量。您将无法使用 sprintf,因此您必须在初始化期间提前格式化字符串。请记住,当调用处理程序时,机器处于非常不稳定的状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)