最近我一直在摆弄GLEW和win32,但遇到了问题。每当我通过关闭窗口退出应用程序时,都会调用Window类的析构函数,并删除我的openGL渲染上下文。我可以说是因为我使用CodeXL测试了程序,并且可以肯定地说我的上下文已删除。但是,如果我通过杀死控制台(使用AllocConsole()创建)退出应用程序,则根据CodeXL不会删除我的上下文,并且会泄漏内存。这是应该破坏我上下文的析构函数:
Window::~Window()
{
wglMakeCurrent(0,0);
wglDeleteContext(renderingContext);
}
有谁知道为什么在关闭控制台时不运行此析构函数,而是在我杀死窗口时运行该析构函数?
任何输入将不胜感激。
最佳答案
是的。所以呢?该进程已被终止,因此操作系统消耗的所有资源均已释放。实际上,如果某个过程无论如何都将终止,则不应清理。只需将需要保存的内容保存到持久性存储中,进行必要的通信以使内容与其他进程保持一致,然后终止即可。
遍历过程中的所有资源并释放/删除它们,就好像您正在清理并给房屋上油漆工作一样,然后拆除人员会用破坏球将其拆除。
在程序终止时,内存泄漏永远不会成为问题! 内存泄漏是程序运行时的一个问题:它们使进程消耗越来越多的资源,最终导致系统资源耗尽。操作系统的 react 是杀死占用系统资源的进程,以获取喘息的空间。
因为这两个 Action 是非常不同的东西。关闭窗口时,系统会发送WM_CLOSE消息,您可以通过适当地离开消息循环来作出 react ,该消息循环从主函数返回,并向运行时发出信号,以调用超出范围的所有对象的构造函数。
关闭控制台窗口时,您的进程将失去其控制终端(AllocConsole将控制台附加为控制终端)。这是一个关键条件,默认行为是立即终止进程。
更新
当然,在流程退出时有一些合法的事情要做。将事情写到日志中,也许会在退出之前生成程序最后状态的自动保存,诸如此类。对于Windows Console Windows,您必须安装一个处理程序,该处理程序为操作系统提供了一种优雅地处理控制台事件的方法。用于此功能的函数称为HandlerRoutine
:(在https://msdn.microsoft.com/en-us/library/windows/desktop/ms683242%28v=vs.85%29.aspx中记录),并使用SetConsoleCtrlHandler进行设置