简单的opengl程序中的内存泄漏

时间:2010-09-10 06:59:15

标签: qt opengl

我写了一个简单的opengl程序来进行一些测试。这是程序:

#include <QApplication>
#include <QGLWidget>
#include <QTimer>
#include <glut.h>

class Ren : public QGLWidget
{
public:
 Ren() : QGLWidget() 
 {
  timer = new QTimer(this);
  connect(timer, SIGNAL(timeout()),
   this, SLOT(updateGL()));
 }

 void startUpdateTimer()
 {
  timer->start(40);
 }

 void initializeGL()
 {
  glShadeModel(GL_SMOOTH);      
  glClearColor(0.5f, 0.5f, 0.5f, 0.0f);     
  glClearDepth(1.0f);       
  glEnable(GL_DEPTH_TEST);   
 }

 void resizeGL(int width, int height)
 {
  if(height == 0){
   height = 1;
  }
  glViewport(0, 0, width, height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  GLfloat aspectRatio = (GLfloat)width / (GLfloat)height;
  gluPerspective(60.0, aspectRatio, 0.01, 10000.0);
  glMatrixMode(GL_MODELVIEW);
 }

 void paintGL()
 {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();

  gluLookAt(0, 0, 1, 0, 0, 0, 0, 1, 0);

  glColor3d(1, 0, 0);
  glutSolidCube(0.3);
 }

 QTimer *timer;
};

int main(int argc, char **argv)
{
 QApplication app(argc, argv);

 Ren r;
 r.show();
 r.startUpdateTimer();

 return app.exec();
}

问题是当计时器处于活动状态时,应用程序正在泄漏内存。 对于泄漏检测,我使用了Windows任务管理器。

4 个答案:

答案 0 :(得分:3)

由于Rend是子类,因此必须声明一个虚拟析构函数。否则,您有内存泄漏,如果在将Ren对象用作QGLObject时删除它,则可能会出现堆损坏。

修改:已移除部分:

在构造函数中,您正在为计时器分配内存,但您永远不会释放它。您需要删除计时器指针。

答案 1 :(得分:0)

请告诉我们您的程序泄漏多少内存的详细信息。我非常怀疑您的代码是否泄漏,因为您只是分配一个 QTimer对象。即使您不删除计时器,这也不会成为问题,因为操作系统无论如何都会释放内存。当然,这很难看,但严格来说不是泄漏

如果分配的内存随着时间的推移稳定增长,则会出现内存泄漏。如果是这种情况,那不是你的代码的错,因为除了计时器一次之外你什么也没有分配。

答案 2 :(得分:0)

对不起。我错了。现在有泄漏。一段时间(大约一分钟)后停止'泄漏'。我认为这是一种opengl或Qt工作。我查看了一些Qt示例,并在Textures示例中看到了相同的内容。同样的事情发生了,如果我改变另一个例子在PaintGL()函数中绘制其他东西(取决于它有不同的'泄漏'时间。

答案 3 :(得分:0)

GLUT原语应该用于运行GLUT主循环的GLUT程序,它清理由基元分配的二次曲面,通过调用GLUT程序之外的GLUT原语,绕过清理任务,然后泄漏内存。

如果添加使用内存泄漏检测程序 - Windows上的Valgrind或Mac上的Instruments - 您会看到泄漏的块来自gluNewQuadric。 删除对glutSolidCude的调用,泄漏将消失。

一个简单的解决方案是使用Free GLUT原语,而不是整个GLUT随您的操作系统一起发货。