C++ 关闭FreeGLUT的最佳方式是什么?

C++ 关闭FreeGLUT的最佳方式是什么?,c++,opengl,console-application,glut,freeglut,C++,Opengl,Console Application,Glut,Freeglut,我真的很难用FreeGLUT关闭我的控制台应用程序 我想知道什么是最好的方法是采取每一个可能的关闭,因为我不希望任何内存泄漏(我非常害怕这些) 因此,我已经尝试了以下方法,这给了我一个类似这样的例外: myProject.exe中0x754e6a6f处的第一次偶然异常:0x40010005:Control-C 因此,正确的做法是: 关闭供过于求的窗口 使用x关闭控制台应用程序 用我的键盘管理器if(keyboardmanager->isKeyDown[27])glutxit()关闭我的过剩窗口

我真的很难用FreeGLUT关闭我的控制台应用程序

我想知道什么是最好的方法是采取每一个可能的关闭,因为我不希望任何内存泄漏(我非常害怕这些)

因此,我已经尝试了以下方法,这给了我一个类似这样的例外:

myProject.exe中0x754e6a6f处的第一次偶然异常:0x40010005:Control-C

因此,正确的做法是:

  • 关闭供过于求的窗口
  • 使用
    x关闭控制台应用程序
  • 用我的键盘管理器
    if(keyboardmanager->isKeyDown[27])glutxit()关闭我的过剩窗口
  • 问题在于:

  • 使用CTRL+C关闭控制台应用程序时,会出现上面的异常
  • 这是VisualStudio 2008 C++中的< < /P> 更新

    我发现异常被抛出,因为我正在调试。所以这不会是个问题。但问题仍然悬而未决:要真正消除过剩,最优雅的方法是什么

    atexit()
    似乎也能工作,所以也许我可以使用它?

    我使用这个函数:

    void glutLeaveMainLoop ( void ); 
    
    他们的sourceforge页面上有更多信息,但我从未使用过该功能:

    glutLeaveMainLoop函数使freeglut停止事件循环。如果GLUT_ACTION_ON_WINDOW_CLOSE选项已设置为GLUT_ACTION_CONTINUE_EXECUTION,则控制将返回到调用glutMainLoop的函数;否则,应用程序将退出


    在空指针上使用
    delete
    是安全的,无需检查。

    我使用
    窗口(int句柄)

    根据ID:OpenGL论坛上的刚体

    void destroy_window() 
    {
     window_valid = -1;
    }
    
    void display_func() 
    {
     if(window_valid == -1)
       return;
     // draw things
    }
    

    感谢Maarten的帖子,这对我很有用:

    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_CONTINUE_EXECUTION);
    
    无论何时,如果要在不使用Termiant的情况下离开mainloop,请使用:

    glutLeaveMainLoop();
    
    不要忘记包含“freeglut.h”

    尝试以下方法:

    glutDestroyWindow(glutGetWindow());
    

    当你的程序关闭时,你不需要担心释放内存,操作系统会回收所有东西,没有任何泄漏。当然,像文件这样的持久资源当然应该被清理干净。<代码> ATEXIT()/Cuffe >可能无法解决C++对象清理的问题。@ Ben,WielMeltEd:但是我应该清除我的KeBoAdMeor对象,因为我的PraveM持有指针,对吗?如果它使用了一些在你的程序终止后仍然存在的资源,是的。但操作系统将回收内存,还应撤销键盘输入捕获,因此键盘管理器可能不需要清理。甚至有一个学派认为,也不要清理持久性资源,其基本原理是,最终您的清理将没有机会运行(可能是灾难性的电源故障),因此您需要逻辑来恢复脏状态。如果你能处理脏状态,那么任何清理都只是浪费时间。如果你关心opengl泄漏(比如说你正在重新创建东西,或者你多次启动并破坏opengl),那么你可以使用来报告所有泄漏的opengl对象。它还报告了您可能做得不正确的各种有用的事情,如冗余状态更改或使用不推荐的功能。看起来确实很有趣。因此,我可以在
    SetConsoleCtrlHandler
    和keychecker中调用此函数以检查
    ESC
    。这样我就可以把我的指针删除器放在主函数中了?最好设置glutCloseFunc来调用一个清除的函数。FreeGLUT将在尝试分解上下文之前调用它,这与在mainloop之后调用不同。好吧,根据最新的GLUT规范(3.7),
    GLUTLEAVEAINLOOP()
    不再存在。那么现在OP的问题的答案是什么呢?
    glutLeaveMainLoop
    仍然存在于FreeGLUT中(我相信OpenGLUT,虽然未经验证,但他们的subwin样本使用了它)。使用最新的稳定版本3.0.0进行测试-它是常规GLUT的一个扩展。Ubuntu有它,但有一个窍门。Ubuntu上的GLUT都是FreeGLUT,FreeGLUT被分为_std和_ext头文件。如果您包括
    GL/glut.h
    ,它只包括
    freeglut\u std.h
    。您必须包含
    GL/freeglut.h
    ,这包括了_std和
    freeglut\u ext.h
    标题,然后您会得到
    glutLeaveMainLoop()
    glutDestroyWindow(glutGetWindow());