Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL glDeleteTextures导致内存泄漏?_C++_Macos_Opengl_Malloc_Glut - Fatal编程技术网

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
一次。当有很多纹理时就是这种情况。