帮助内存泄漏(malloc)

时间:2010-05-24 21:42:33

标签: c++ c malloc

我遵循了一个使用OGL tesselaton的教程。在其中一个回调中有一个malloc,每当我渲染一个新帧时它就会产生泄漏。

void CALLBACK combineCallback(GLdouble coords[3], GLdouble *vertex_data[4],
                              GLfloat weight[4], GLdouble **dataOut)
{
    GLdouble *vertex;

    vertex = (GLdouble *) malloc(6 * sizeof(GLdouble));
    vertex[0] = coords[0];
    vertex[1] = coords[1];
    vertex[2] = coords[2];


    for (int i = 3; i < 6; i++)
    {

        vertex[i] = weight[0] * vertex_data[0][i] +
            weight[1] * vertex_data[0][i] +
            weight[2] * vertex_data[0][i] +
            weight[3] * vertex_data[0][i];
    }


    *dataOut = vertex;


}

我试图释放(顶点)但是多边形没有渲染。我也尝试在堆上分配然后执行删除(顶点)但然后多边形呈现​​为笨拙。我不知道该怎么做。

由于

6 个答案:

答案 0 :(得分:1)

您应该在free点上致电dataOut。例如,如果您是通过调用函数执行此操作:

combineCallback (coords, vertex_data, weight, &dataOut);

然后您应该在稍后使用它之后致电free (dataOut)。如果您free (vertex),那实际上意味着可以覆盖任何dataOut点,因为您已将vertex的地址指定为*dataOut。换句话说,不要免费vertex;免费dataOut指向的任何地方。

答案 1 :(得分:0)

您要查看的工具名为valgrind,位于http://valgrind.org/。假设您正在Linux系统上运行。

作为读者的注释,valgrind中的“-grind”与英文单词“grind”无关。

  

“Val”与世界“价值”一样。 “grind”发音为短'i' - 即。 “咧嘴笑”(与“镀锡”押韵)而不是“讽刺”(押韵与“发现”)。

答案 2 :(得分:0)

您无法释放顶点,因为您要将内存分配给dataOut对象。完成后,您需要释放dataOut对象。

答案 3 :(得分:0)

我不知道如何解决你的内存泄漏情况,但是,我要指出的一点是,使用“删除”(我假设你的意思是c ++'delete'操作符)来清理已分配的内存对于“malloc”,非常气馁。

一般来说,您需要坚持使用适合您以前分配的功能。在C ++中,你在使用'new'分配内存后会使用'delete',而在C中你会在使用'malloc'分配内存后使用'free'。

答案 4 :(得分:0)

根据GLUT_TESS_COMBINE的the docs

  

在调用gluTessEndPolygon后,用户有责任释放内存。

一种方法是将您分配的内存添加到链接列表中,并在完成后将其全部释放。

答案 5 :(得分:0)

完成使用后,您需要在此功能之外的某处释放数据。在没有看到其他代码的情况下,有点难以猜测它会在哪里。您可能最好将数据分配到其他地方,并将指针传递给它,这样就可以修改其他数据。当您可能生成相当多的数据时,尤其如此(它可以避免分配和释放大量数据)。