OpenGL与GLUT-- malloc错误

时间:2011-07-30 16:33:57

标签: image opengl malloc cimg

我想屏幕从已在OpenGL中渲染的GLUT窗口中截取图像。在显示回调的一侧,我插入了这段代码:

display() {
        drawTriangle(); //Renders the image
        if(shouldDisplay) {
            shouldDisplay=0;
            bytes = width*height*3; //Color space is RGB
            buffer = (GLubyte *)malloc(bytes); //buffer is global var for now
                glFinish();
            glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer);

        }
        glutSwapBuffers();
    }

此代码运行后,malloc开始失败。它失败了ENOMEM,错误12.我对操作系统或GLUT了解不足以了解为什么会发生这种情况。我只想在一台3 GB的机器上分配17K。我正在使用Windows XP和Visual Studio C ++ 2010 Express。任何帮助或建议表示赞赏。

3 个答案:

答案 0 :(得分:2)

该代码最后错过了free(buffer),因此每次重绘都会消耗越来越多的内存,直到进程耗尽内存和/或地址空间(后者仅在32位系统上,因为64在合理的时间内,很少有地址空间用于小额分配。)

答案 1 :(得分:1)

让我重新解释这个半翘起的答案。我认为堆正在被删除,可能是由于缺少 free()和连续分配,可能是glReadPixels覆盖了你的目标缓冲区。

大多数帧缓冲区至少是32位/双字对齐,这表明,正如这里的评论所说,w * h * 4字节可能只是与内部表示匹配。

将对齐设置为1个字节(就像另一个答案所说)对我来说似乎也很好。

答案 2 :(得分:1)

在调用glReadPixels之前尝试glPixelStorei(GL_PACK_ALIGNMENT, 1);