C++ 关闭FreeGLUT的最佳方式是什么?
我真的很难用FreeGLUT关闭我的控制台应用程序 我想知道什么是最好的方法是采取每一个可能的关闭,因为我不希望任何内存泄漏(我非常害怕这些) 因此,我已经尝试了以下方法,这给了我一个类似这样的例外: myProject.exe中0x754e6a6f处的第一次偶然异常:0x40010005:Control-C 因此,正确的做法是: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()关闭我的过剩窗口
x关闭控制台应用程序
if(keyboardmanager->isKeyDown[27])glutxit()关闭我的过剩窗口代码>
这是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());