gpt4 book ai didi

c++ - glutMainLoop激活后如何回收内存?

转载 作者:太空狗 更新时间:2023-10-29 20:06:46 27 4
gpt4 key购买 nike

根据 OpenGL 文档,
3.1 glutMainLoop

glutMainLoop 进入 GLUT 事件处理循环。

用法

void glutMainLoop(void);

描述glutMainLoop 进入 GLUT 事件处理循环。在 GLUT 程序中,该例程最多应调用一次。一旦调用,此例程将永远不会返回。它将根据需要调用任何已注册的回调。

因此无论何时调用 glutMainLoop(),它都不会返回。结果,分配后我无法释放内存。我的问题是:我需要从文件中加载图像,这本书(Superbible 第 4 版)的解决方案是将这个加载文件例程放在绘图函数中。但是,我意识到由于多次打开和关闭文件,这种方法太昂贵了。记忆起我在学习B-tree时的数据结构课,访问外部资源的成本是相当大的,所以我尽量避免。所以我的替代解决方案是将这个加载图像例程放在只调用一次的设置场景函数中。但是现在我面临另一个问题,由于 glutMainLoop,我无法删除内存。在这种情况下我能做什么?我是 openGL 的新手,所以我真的不知道如何处理这个特殊问题。任何想法将不胜感激。

#include <cstdio> 
#include <cstdlib>
#include <iostream>

#include "Utility.h"
#include "TgaHeader.h"
#include "TgaImage.h"

#include <GL/glut.h>

using namespace std;

TgaImage* image = NULL;

void setupScene() {
// set color background
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
// load image from file
image = loadTgAFile( "Fire.tga" );
}

void renderScene() {
// clear color
glClear( GL_COLOR_BUFFER_BIT );
// TGA format is 1 byte aligned
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
glRasterPos2i( 0, 0 );
if( image != NULL ) {
glDrawPixels(
image->header.width,
image->header.height,
image->format,
GL_UNSIGNED_BYTE,
image->pixels
);
}
glutSwapBuffers();
}

void resizeWindow( int w, int h ) {
if( h == 0 ) {
h = 1;
}
glViewport( 0, 0, w, h );
// reset coordinate before modifying
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
// set the clipping volume
gluOrtho2D( 0.0f, w, 0.0f, h );
// reset to modelview matrix
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}

int main( int argc, char** argv ) {
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowSize( 512, 512 );
glutCreateWindow( "Image" );
// register callback
glutReshapeFunc( resizeWindow );
glutDisplayFunc( renderScene );
// initialize scene
setupScene();
glutMainLoop();
// it will never reach this
delete image;
}

谢谢,

最佳答案

“推荐”机制是使用atexitonexit 函数来安排一个函数在程序退出时调用:

void exitProgram() {
// cleanup code
}

// then put this in main():
atexit( exitProgram );

请注意,一旦程序退出,操作系统就会清除该程序正在使用的所有资源,包括内存,因此从技术上讲,这不是内存泄漏。

关于c++ - glutMainLoop激活后如何回收内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6273275/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com