C++ 内存泄漏,找不到位置

标签 c++ opengl memory-management memory-leaks freeglut

我正在使用 Visual Studio 2008,开发 OpenGL 窗口。我已经创建了几个用于创建骨架的类,一个用于关节,一个用于皮肤,一个用于 body (它是多个关节和皮肤的支架),一个用于读取骨架/皮肤文件。

在我的每个类中,我都对我的大部分数据使用指针,其中大部分是使用 = new int[XX] 声明的。我有一个用于删除指针的每个类的析构函数,使用 delete[XX]。

在我的 GLUT 显示函数中,我让它声明一个主体,打开文件并绘制它们,然后在显示结束时删除主体。但是程序中的某处仍然存在内存泄漏。随着时间的推移,它的内存使用量一直在以一致的速度增加,我将其解释为未被删除的东西。

我不确定是过剩显示函数中的某些东西没有删除 Body 类,还是其他东西。我已经按照 Visual Studio 2008 中的内存泄漏检测步骤进行操作,它没有报告任何泄漏,但我不能 100% 确定它是否适合我。我对 C++ 不是很流利,所以我可能忽略了一些东西,有人能看到吗?

来自主要:

void display(void){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    Body *body = new Body();
    body->readSkel("C:\\skel2.skel");
    body->drawBody();
    body = new Body();
    body->readSkel("C:\\skel1.skel");
    body->drawBody();
    glutSwapBuffers();  
    body->~Body();
    delete body;
}

来自正文:

Body::Body(){
    skelFile = string();
    skinFile = string();
    totalJoints = 0;
    joints = new Joint[25];
    skin = new Skin;
}

Body::~Body(){
    delete[25] joints;
    delete skin; 
}

最佳答案

在这段代码中:

Body *body = new Body();
body->readSkel("C:\\skel2.skel");
body->drawBody();
body = new Body();

你正在泄露一个 Body 因为你没有删除第一个。

还有这个:

body->~Body();
delete body;

很奇怪。您不会像那样显式调用析构函数 - delete 负责调用析构函数。

这段代码:

delete[25] joints;

也很奇怪。正确的形式是:

delete [] joints;

您使用的是非标准语法,25 将被忽略。参见 this question获取更多信息。

关于C++ 内存泄漏,找不到位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2601916/

相关文章:

c++ - 模板元编程 GCC 错误

c++ - 如何销毁包含自引用指针的对象?

c++ - 为什么 std::vector 调整大小失败?

c++ - 我们可以使用单个指针实现双向链表吗?

c++ - 在cygwin中使用mingw编译器编译c++程序时缺少dll

java - OpenGL 1.1 更改颜色会更改以前的颜色吗?

c - 简单的碰撞检测?

objective-c - cocoa OpenGL总是白色

java - 我在哪里可以了解 Java 中的内存管理是如何工作的?

读取垃圾内存会破坏程序流程吗?