exit函数使用造车内存泄漏问题
2009-04-12 21:18
537 查看
使用过glut的都一定记得keyboard函数中一个最常用的响应指令:
是的,一直以来我也是这么使用的,不管写的是一个不足百行的测试例子。写大一点的库。直到前两天逛论坛,看到了一个帖子,我为之一震啊,一直以来我很自信自己的代码绝对没有内存泄漏问题。因为只要new了我就一定会delete。看一下我的main函数:
glutMainLoop以后释放资源,看似无瑕可击,但是碰到exit居然是那么不堪一击。
我在keyboard的相应函数中使用了最上面的语句,也就是说exit以后,glutMainLoop后面的语句是不会执行的。。。
所有的资源将得不到释放。。。
解决方案:
设置一个结束标志量,在display函数中加一个判断,如果标志为真,先释放资源。再调用exit函数结束。
也正是我选择的方案:不使用exit函数,使用freeglut库,基本和glut一样,不同的是他提供了一个不同于glutMainLoop函数glutMainLoopEvent()函数,后者每次循环返回。当结束标志为真时,推出渲染,销毁窗口,释放资源。。。。
最终的main函数:
总之:exit使用一定要谨慎。。。
switch(key) { case 27: case 'q': case 'Q': exit(0); break; }
是的,一直以来我也是这么使用的,不管写的是一个不足百行的测试例子。写大一点的库。直到前两天逛论坛,看到了一个帖子,我为之一震啊,一直以来我很自信自己的代码绝对没有内存泄漏问题。因为只要new了我就一定会delete。看一下我的main函数:
int _tmain(int argc, char* argv[]) { glutInit (&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (g_iWindowWid, g_iWindowHeigh); glutInitWindowPosition (100, 100); glutCreateWindow ("Bvh Backer"); init(); glutDisplayFunc (display); glutReshapeFunc (reshape); glutIdleFunc(idle); glutMouseFunc(mouse); glutMotionFunc(motion); glutKeyboardFunc(keyboard); glutMainLoop (); KeyboardManger::FreeInstance(); MouseManger::FreeInstance(); GuiManger::FreeInstance(); return 0; }
glutMainLoop以后释放资源,看似无瑕可击,但是碰到exit居然是那么不堪一击。
我在keyboard的相应函数中使用了最上面的语句,也就是说exit以后,glutMainLoop后面的语句是不会执行的。。。
所有的资源将得不到释放。。。
解决方案:
设置一个结束标志量,在display函数中加一个判断,如果标志为真,先释放资源。再调用exit函数结束。
也正是我选择的方案:不使用exit函数,使用freeglut库,基本和glut一样,不同的是他提供了一个不同于glutMainLoop函数glutMainLoopEvent()函数,后者每次循环返回。当结束标志为真时,推出渲染,销毁窗口,释放资源。。。。
最终的main函数:
int main(int argc, char* argv[]) { glutInit (&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (Share::getWindowWid(), Share::getWindowHeight()); glutInitWindowPosition (100, 100); int window = glutCreateWindow ("Bvh Backer"); Init(); glutReshapeFunc ( Reshape ); glutMouseFunc( MouseCB ); glutMotionFunc( MotionCB ); glutKeyboardFunc( KeyBoardCB ); //glutMainLoop (); while ( Share::getRunFalg() ) { glutMainLoopEvent(); Display(); } glutDestroyWindow(window); KeyboardManger::FreeInstance(); MouseManger::FreeInstance(); GUISystem::FreeInstance(); CTimer::FreeInstance(); CTextureManager::FreeInstance(); Share::destroy(); return 0; }
总之:exit使用一定要谨慎。。。
相关文章推荐
- 关于Android开发中使用System.exit(0)的问题(如写返回键响应时用到双击退出函数的时候)
- C语言中的素数环问题(回溯)//函数exit的使用
- 事件委托使用时内存泄漏的问题
- js中解决函数中使用外部函数局部变量的问题(闭包问题)
- 刚才遇到了关于C#使用外部DLL函数上的char*的问题。
- C# 解决使用Process.Start()函数打开url被360拦截问题
- Boost关于bind的使用以及函数对象和传递参数的问题
- 关于使用setInterval()函数制作滚动越来越快的问题
- Java Split()函数使用中一些要注意的问题
- linux/Unix 共享内存 mmap() 函数使用的一个问题
- intel fortran 各类函数库的使用方法及可能遇到的问题解决
- php使用odbc执行复杂函数遇到的问题,sql语句直接在sqlserver数据库中运行有结果,使用php总是为空
- STM32(MDK)中不能使用printf()函数的问题
- 使用PHP文件操作函数fopen()遇到的问题
- PHP使用empty检查函数返回结果时报Fatal error: Can't use function return value in write context的问题
- 使用 Android Studio 检测内存泄漏与解决内存泄漏问题
- 使用 Android Studio 检测内存泄漏与解决内存泄漏问题
- for循环的使用 反转字符串,手写strrev()函数 解决问题
- 使用Eclipse对JUnit测试函数进行Debug时断点无效问题
- SQL中一些不经意隐式类型转换或者函数使用导致索引失效问题