我最近一直在与GLEW和win32打交道,我遇到了一个问题。每当我通过关闭窗口退出我的应用程序时,我的Window类的析构函数被调用,我的openGL渲染上下文被删除。我可以说,因为我使用CodeXL测试了程序,并且我的上下文被删除是肯定的。但是如果我通过杀死我的控制台(通过使用AllocConsole()创建)退出我的应用程序,我的上下文不会根据CodeXL被删除并泄漏内存。这是析构函数,它应该破坏我的上下文:
Window::~Window()
{
wglMakeCurrent(0,0);
wglDeleteContext(renderingContext);
}
有人知道为什么这个析构函数在关闭控制台时不运行,但每当我杀死窗口时 都会运行?
任何意见都会受到赞赏。
答案 0 :(得分:5)
我的上下文不会根据CodeXL被删除并泄漏内存。
是。所以呢?该进程已被终止,因此它所消耗的所有资源都被操作系统释放。事实上,如果一个进程无论如何都要终止,你就不应该清理。只需将那些需要保存的内容保存到持久存储中,进行必要的通信,以便与其他进程保持一致,然后终止。
迭代过程中的所有资源并释放/删除它们就好像你正在清理并在拆迁人员用破坏球将其撕下来之前给房子一个油漆工作。
内存泄漏在程序终止时永远不会成为问题!内存泄漏是程序运行时的一个问题:它们会使进程占用更多资源,最终导致系统资源耗尽。操作系统的反应是杀死占用系统资源的进程,以获得喘息空间。
有没有人知道为什么这个析构函数在关闭控制台时没有运行,但每当我杀死窗口时都会运行?
因为这两个动作是非常不同的事情。关闭窗口时,系统发送WM_CLOSE消息,您可以通过正确地离开消息循环来做出反应,从main函数返回,该函数指示运行时调用超出范围的所有对象的构造函数。
当您关闭控制台窗口时,您的进程将失去其控制终端(AllocConsole将控制台作为控制终端连接)。这是一个严重的情况,默认行为是立即终止进程。
在流程退出时,当然有几个合法的事情要做。将事物写入日志,可能会在退出之前生成程序最后状态的自动保存,这样的事情。在Windows控制台Windows中,您必须安装一个处理程序,它为操作系统提供了一种优雅地处理控制台事件的方法。此功能称为HandlerRoutine
:(记录在https://msdn.microsoft.com/en-us/library/windows/desktop/ms683242%28v=vs.85%29.aspx)并设置为SetConsoleCtrlHandler