OpenGL glDeleteTextures导致内存泄漏?

时间:2012-03-19 12:19:18

标签: c++ macos opengl malloc glut

我的程序一次一个地渲染大型jpegs作为纹理,并允许用户通过重复使用“相同”纹理在它们之间切换。

我在开始时拨打glGenTextures(1, &texture);一次。

然后每次我想交换我使用的图像:

FreeTexture( texture );
ROI_img = fetch_image(temp, sortVector[tPiece]);

loadTexture_Ipl( ROI_img , &texture );

这里有两个被调用的函数:

int loadTexture_Ipl(IplImage *image, GLuint *text)
{
    if (image==NULL) return -1;
    glBindTexture( GL_TEXTURE_2D, *text );

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, ROI_WIDTH, ROI_HEIGHT,0, GL_BGR, GL_UNSIGNED_BYTE, image->imageData);
    return 0;
}

void FreeTexture(GLuint texture)
{
    glDeleteTextures( 1, &texture);
}

我的问题是,经过一些图像后,它们会停止渲染(纹理全部为黑色)。如果我一直试图切换,我会收到以下错误消息:

test(55248,0xacdf22c0) malloc: *** mmap(size=744001536) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Mar 19 11:57:51 Ants-MacBook-Pro.local test[55248] <Error>: CGSImageDataLock: Cannot allocate memory

我以为glDeleteTextures每次都会释放内存?

关于如何更好地实现这一点的任何想法?

P.S。这是一个遇到内存泄漏的屏幕(https://p.twimg.com/AoWVy8FCMAEK8q7.png:large)<

2 个答案:

答案 0 :(得分:4)

由于您要重用纹理,因此不应使用glDeleteTextures删除它。如果你这样做,你需要使用glGenTextures创建一个新的纹理,我没有看到你在loadTexture_Ipl函数中这样做。

答案 1 :(得分:0)

glGenTexturesglDeleteTextures成对出现。如果您确实要删除纹理(也许是因为您很可能不会再使用该纹理),请像已经一样删除它,并在设置新纹理之前再次调用glGenerateTextures