Утечка памяти в простой программе opengl - PullRequest
1 голос
/ 10 сентября 2010

Я написал простую программу 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 ]

3 голосов
/ 10 сентября 2010

Поскольку Rend является подклассом, вы должны объявить виртуальный деструктор.В противном случае возможны утечки памяти и повреждение кучи, если вы удалите объект Ren при использовании его в качестве QGLObject.

Редактировать : Удаленная часть:

В конструкторе,Вы выделяете память для таймера, но никогда не отпускаете его.Вам нужно удалить указатель таймера.

0 голосов
/ 27 июля 2011

Примитивы GLUT предполагается использовать в программах GLUT, выполняющих основной цикл GLUT, который очищает квадрики, выделенные примитивами, вызывая примитивы GLUT вне программы GLUT, вы обходите задачи очистки, а затем у вас возникает утечка памяти.

Если вы добавите используемую программу обнаружения утечек памяти - Valgrind для Windows или Instruments для Mac - вы бы увидели, что утечка блоков происходит из gluNewQuadric.Удалите вызов glutSolidCude, и утечка исчезнет.

Простое решение - использовать бесплатные примитивы GLUT вместо всей поставки GLUT с вашей ОС.

0 голосов
/ 10 сентября 2010

Извините. Я был неправ. Там сейчас подтекает. «Утечка» прекращается через некоторое время (около минуты). Я думаю, что это своего рода работа opengl или Qt. Я посмотрел несколько примеров Qt и увидел то же самое в примере с текстурами. То же самое происходит, если я изменяю другие примеры, чтобы нарисовать что-то еще в функции PaintGL () (в зависимости от этого существует разное время утечки).

0 голосов
/ 10 сентября 2010

Пожалуйста, дайте нам более подробную информацию о том, сколько памяти у вашей программы. Я очень сомневаюсь, что ваш код протекает, потому что вы просто выделяете один объект QTimer. Даже если вы не удалите свой таймер, это не будет проблемой, потому что ОС все равно освобождает память. Это, конечно, некрасиво, но не утечка в строгом смысле.

Если выделенная память неуклонно растет с течением времени, то происходит утечка памяти. Если это так, то это не ошибка вашего кода, поскольку вы просто ничего не выделяете, кроме таймера один раз .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...