繁体   English   中英

退出控制台后,析构函数无法运行

[英]Destructor not run after exiting console

最近我一直在摆弄GLEW和win32,但遇到了问题。 每当我通过关闭窗口退出应用程序时,都会调用Window类的析构函数,并删除我的openGL渲染上下文。 我可以说是因为我使用CodeXL测试了程序,并且可以肯定地说我的上下文被删除了。 但是,如果我通过杀死控制台(使用AllocConsole()创建)退出应用程序,则根据CodeXL不会删除我的上下文,并且会泄漏内存。 这是应该破坏我上下文的析构函数:

Window::~Window()
{
    wglMakeCurrent(0,0);
    wglDeleteContext(renderingContext);
}

有谁知道为什么关闭控制台,但每当我杀窗口运行时该析构函数不能运行?

任何输入将不胜感激。

我的上下文不会根据CodeXL删除并泄漏内存。

是。 所以呢? 该进程已被终止,因此操作系统消耗的所有资源均已释放。 实际上,如果某个过程无论如何都将终止,则不应清理。 只需将需要保存的内容保存到持久性存储中,进行必要的通信以使内容与其他进程保持一致,然后终止即可。

遍历一个过程中的所有资源并释放/删除它们,就好像您正在清理并给房屋上油漆工作一样,然后拆除人员用毁坏的球将其拆除。

在程序终止时,内存泄漏永远不会成为问题! 内存泄漏是程序运行时的问题:它们使进程消耗越来越多的资源,最终导致系统资源耗尽。 操作系统的反应是杀死占用系统资源的进程,以获取喘息的空间。

有谁知道为什么在关闭控制台时不运行此析构函数,而是在我杀死窗口时运行该析构函数?

因为这两个动作是非常不同的东西。 关闭窗口时,系统会发送WM_CLOSE消息,您可以通过适当地离开消息循环来作出反应,该消息循环从主函数返回,并向运行时发出信号,以调用超出范围的所有对象的构造函数。

关闭控制台窗口时,您的进程将失去其控制终端(AllocConsole将控制台附加为控制终端)。 这是一个关键条件,默认行为是立即终止进程。

更新

当然,在流程退出时有一些合法的事情要做。 将事情写到日志中,也许会在退出之前生成程序最后状态的自动保存,诸如此类。 对于Windows控制台Windows,您必须安装处理程序,该处理程序为操作系统提供了一种优雅地处理控制台事件的方法。 此功能称为HandlerRoutine :(在https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms683242%28v=vs.85%29.aspx中记录 ),并使用SetConsoleCtrlHandler进行设置

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM