我写了一个简单的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任务管理器。
答案 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随您的操作系统一起发货。