我遵循了一个使用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;
}
我试图释放(顶点)但是多边形没有渲染。我也尝试在堆上分配然后执行删除(顶点)但然后多边形呈现为笨拙。我不知道该怎么做。
由于
答案 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)
答案 5 :(得分:0)
完成使用后,您需要在此功能之外的某处释放数据。在没有看到其他代码的情况下,有点难以猜测它会在哪里。您可能最好将数据分配到其他地方,并将指针传递给它,这样就可以修改其他数据。当您可能生成相当多的数据时,尤其如此(它可以避免分配和释放大量数据)。