退出控制台后析构函数不是 运行
Destructor not run after exiting console
最近我一直在摆弄 GLEW 和 win32,我 运行 遇到了问题。每当我通过关闭 window 退出我的应用程序时,我的 Window class 的析构函数被调用并且我的 openGL 渲染上下文被删除。我可以这么说,因为我使用 CodeXL 测试了该程序,并且我的上下文被删除是肯定的。但是,如果我通过终止我的控制台(使用 AllocConsole() 创建)退出我的应用程序,我的上下文不会根据 CodeXL 被删除并泄漏内存。这是应该破坏我的上下文的析构函数:
Window::~Window()
{
wglMakeCurrent(0,0);
wglDeleteContext(renderingContext);
}
有谁知道为什么这个析构函数在关闭控制台时不是运行但是是运行 每当我杀死 window?
如有任何意见,我们将不胜感激。
my context does not get deleted according to CodeXL and leaks memory.
是的。所以呢?该进程已被终止,因此它消耗的所有资源都由操作系统释放。事实上,如果进程无论如何都要终止,您 不应该 清理。只需将那些需要保存的东西保存到持久存储中,进行必要的通信以使其他进程有序,然后终止。
遍历流程中的所有资源并freeing/deleting它们就像您正在清理房屋并在拆除人员用破坏球将其拆毁之前给房屋刷漆。
内存泄漏从来不是程序终止时的问题!内存泄漏是程序运行时的问题:它们使进程消耗更多的资源,最终导致系统资源耗尽。操作系统的反应是杀掉占用系统资源的进程,喘口气space.
Does anyone know why this destructor is not run when closing the console but is run whenever I kill the window?
因为这两个动作是非常不同的东西。当关闭 window 时,系统会发送一条 WM_CLOSE 消息,您可以通过适当地离开消息循环来对此做出反应,从主函数返回,该函数向运行时发出信号以调用所有对象的构造函数超出范围。
当您关闭控制台 window 时,您的进程将失去其控制终端(AllocConsole 将控制台附加为控制终端)。这是一个关键条件,默认行为是立即终止进程。
更新
在进程退出时当然有几件合法的事情要做。将内容写入日志,可能会在退出前生成程序最后状态的自动保存,诸如此类。当谈到 Windows 控制台 Windows 时,您必须安装一个处理程序,它为操作系统提供了一种优雅地处理控制台事件的方法。这个函数称为 HandlerRoutine
:(记录在 https://msdn.microsoft.com/en-us/library/windows/desktop/ms683242%28v=vs.85%29.aspx) and set with SetConsoleCtrlHandler
最近我一直在摆弄 GLEW 和 win32,我 运行 遇到了问题。每当我通过关闭 window 退出我的应用程序时,我的 Window class 的析构函数被调用并且我的 openGL 渲染上下文被删除。我可以这么说,因为我使用 CodeXL 测试了该程序,并且我的上下文被删除是肯定的。但是,如果我通过终止我的控制台(使用 AllocConsole() 创建)退出我的应用程序,我的上下文不会根据 CodeXL 被删除并泄漏内存。这是应该破坏我的上下文的析构函数:
Window::~Window()
{
wglMakeCurrent(0,0);
wglDeleteContext(renderingContext);
}
有谁知道为什么这个析构函数在关闭控制台时不是运行但是是运行 每当我杀死 window?
如有任何意见,我们将不胜感激。
my context does not get deleted according to CodeXL and leaks memory.
是的。所以呢?该进程已被终止,因此它消耗的所有资源都由操作系统释放。事实上,如果进程无论如何都要终止,您 不应该 清理。只需将那些需要保存的东西保存到持久存储中,进行必要的通信以使其他进程有序,然后终止。
遍历流程中的所有资源并freeing/deleting它们就像您正在清理房屋并在拆除人员用破坏球将其拆毁之前给房屋刷漆。
内存泄漏从来不是程序终止时的问题!内存泄漏是程序运行时的问题:它们使进程消耗更多的资源,最终导致系统资源耗尽。操作系统的反应是杀掉占用系统资源的进程,喘口气space.
Does anyone know why this destructor is not run when closing the console but is run whenever I kill the window?
因为这两个动作是非常不同的东西。当关闭 window 时,系统会发送一条 WM_CLOSE 消息,您可以通过适当地离开消息循环来对此做出反应,从主函数返回,该函数向运行时发出信号以调用所有对象的构造函数超出范围。
当您关闭控制台 window 时,您的进程将失去其控制终端(AllocConsole 将控制台附加为控制终端)。这是一个关键条件,默认行为是立即终止进程。
更新
在进程退出时当然有几件合法的事情要做。将内容写入日志,可能会在退出前生成程序最后状态的自动保存,诸如此类。当谈到 Windows 控制台 Windows 时,您必须安装一个处理程序,它为操作系统提供了一种优雅地处理控制台事件的方法。这个函数称为 HandlerRoutine
:(记录在 https://msdn.microsoft.com/en-us/library/windows/desktop/ms683242%28v=vs.85%29.aspx) and set with SetConsoleCtrlHandler