我被要求维护一个我没写过的图书馆。我有一个应用程序正在做许多不同的视图。它们可以是不同的尺寸(宽度/高度),它们可以是不同的场景,它们当然是不同的视角。通常代码
initialize view
set resolution of view
do stuff to view
clear view
在一个过程中重复几次。
Windows任务管理器显示存在内存泄漏。该应用程序是围绕一个C层设计的,该C层调用一个名为render的C ++对象。 **中的代码表示C层。所有其他都在对象内。
初始化新视图看起来像
**if there is an old render delete it.**
{
glDeleteVertexArrays(1, &this->vao);
glDeleteBuffers(1, &this->positionBuffer);
glDeleteBuffers(1, &this->fbo);
glDeleteBuffers(1, &this->rbo);
glDeleteBuffers(1, &this->ibo);
glDeleteBuffers(1, &this->dbo);
}
**Create new render**
this->rbo = NULL;
this->fbo = NULL;
this->ibo = NULL;
this->dbo = NULL;
initialize this render's scalars.
设置视图分辨率
glDeleteBuffers(1, &this->rbo);
glDeleteBuffers(1, &this->fbo);
glDeleteBuffers(1, &this->dbo);
glGenRenderbuffers(1, &this->rbo);
glBindRenderbuffer(GL_RENDERBUFFER, this->rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, width, height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
error check
glGenRenderbuffers(1, &this->dbo);
glBindRenderbuffer(GL_RENDERBUFFER, this->dbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, width, height);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
error check
glGenFramebuffers(1, &this->fbo);
glBindFramebuffer(GL_FRAMEBUFFER, this->fbo);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, this->rbo);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, this->dbo);
error check
和清晰的视图看起来像
glDeleteVertexArrays(1, &this->vao);
glDeleteBuffers(1, &this->positionBuffer);
glDeleteBuffers(1, &this->fbo);
glDeleteBuffers(1, &this->rbo);
glDeleteBuffers(1, &this->ibo);
glDeleteBuffers(1, &this->dbo);
阅读表明这不是使用GPU的最佳方式,但在我看来它应该有效。他们是持久性的:)我看到内存被分配在视图的设置分辨率中,但是内存看起来像它被释放,好吧,几乎无处不在。如果是这样的话......为什么泄漏?我忽略了一些明显的东西吗?
我已经阅读了类似措辞的问题,但没有看到答案。我在此处获得的删除次数远多于分配。
答案 0 :(得分:0)
要添加到BDL的评论,您还可以尝试GLIntercept来验证删除是否正确发生。即使您没有使用核心OpenGL配置文件,这个出色的工具也可以捕获所有OpenGL调用并工作。
然而,您可能是任务管理员的受害者。取自article on CodeProject:
首要任务是确认存在内存泄漏。许多开发人员使用Windows任务管理器来确认应用程序中是否存在内存泄漏。使用任务管理器不仅具有误导性,而且还没有提供有关内存泄漏位置的大量信息。
首先让我们试着了解任务管理器内存信息是如何误导的。任务管理器显示工作集内存,而不是实际使用的内存。那是什么意思呢?此内存是已分配的内存,而不是已用内存。进一步补充,工作集中的一些内存可以由其他进程/应用程序共享。
确保您确认自己确实有泄漏。然后我建议检查你的应用程序发出的OpenGL调用。