C++ OpenGL glDeleteTextures导致内存泄漏?
我的程序一次渲染一个纹理,并允许用户通过重新使用“相同”纹理在它们之间切换 我调用C++ OpenGL glDeleteTextures导致内存泄漏?,c++,macos,opengl,malloc,glut,C++,Macos,Opengl,Malloc,Glut,我的程序一次渲染一个纹理,并允许用户通过重新使用“相同”纹理在它们之间切换 我调用glGenTextures(1,&texture)一开始一次 然后每次我想交换我使用的图像时: FreeTexture( texture ); ROI_img = fetch_image(temp, sortVector[tPiece]); loadTexture_Ipl( ROI_img , &texture ); 以下是正在调用的两个函数: int loadTexture_Ipl(IplImage
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
测试(55248,0xacdf22c0)malloc:**mmap(大小=744001536)失败(错误代码=12)
***错误:无法分配区域
***在malloc\u error\u break中设置断点以进行调试
3月19日11:57:51 Ants-MacBook-Pro.本地测试[55248]:CGSImageDataLock:无法分配内存
我以为glDeleteTextures
每次都会释放内存
关于如何更好地实施这一点,有什么想法吗
p、 这是一个遇到内存泄漏的屏幕(https://p.twimg.com/AoWVy8FCMAEK8q7.png:large)由于要重用纹理,因此不应使用glDeleteTextures将其删除。如果这样做,您需要使用glGenTextures创建一个新的纹理,我看不出您在loadTexture_Ipl函数中这样做。因为您想重用您的纹理,所以不应该使用glDeleteTextures删除它。如果这样做,您需要使用glGenTextures创建一个新的纹理,我看不出您在loadTexture_Ipl函数中这样做。glGenTextures
和glDeleteTextures
成对进行。如果你真的想删除你的纹理(可能是因为你很可能不会再使用该纹理),在设置一个新的纹理之前,先删除它,然后再次调用glGenerateTextures
,glGenTextures
和glDeleteTextures
成对进行。如果您真的想删除纹理(可能是因为您很可能不会再次使用该纹理),请像以前一样删除它,并在设置新纹理之前再次调用glGenerateTextures
,然后调用glTexImage*在传递给它的指针处复制内存,通常将其存储在特殊的图形内存中。使用glDeleteTextures时不会删除原始内存。我不知道这是否是你的问题,因为你的问题不清楚。谢谢你的帮助。如何释放原始内存?@Zyx2000当然可以释放内存。它还能做什么?Read@VJovic它从不释放OpenGL本身没有分配的内存,这就是我所说的。它也没有说在链接中释放内存。另外,请注意,不应删除或重新配置纹理(glTexParameteri(),glPixelStorei()),只需再次调用glTexImage2D()。glTexImage*调用在传递给它的指针处复制内存,通常将其存储在特殊的图形内存中。使用glDeleteTextures时不会删除原始内存。我不知道这是否是你的问题,因为你的问题不清楚。谢谢你的帮助。如何释放原始内存?@Zyx2000当然可以释放内存。它还能做什么?Read@VJovic它从不释放OpenGL本身没有分配的内存,这就是我所说的。它也没有说在链接中释放内存。另外请注意,您不应删除或重新配置纹理(glTexParameteri(),glPixelStorei()),您只需再次调用glTexImage2D()。在阅读此内容后,我将其从函数中删除@AntWilson:但是您没有删除与之匹配的glDeleteTextures
glGenTextures
创建纹理名称<代码>glDeleteTextures
将其删除。它们是成对的,比如new
和delete
。如果你new
something,你只能delete
一次。当有很多纹理时就是这种情况。我读了这篇文章后从函数中删除了它@AntWilson:但是您没有删除与之匹配的glDeleteTextures
glGenTextures
创建纹理名称<代码>glDeleteTextures将其删除。它们是成对的,比如new
和delete
。如果你new
something,你只能delete
一次。当有很多纹理时就是这种情况。