[英]Why doesn't this work?
我试图通过创建一个全局变量来解决GLU回调中的内存泄漏,但现在它不会绘制任何东西:
GLdouble *gluptr = NULL;
void CALLBACK combineCallback(GLdouble coords[3], GLdouble *vertex_data[4],
GLfloat weight[4], GLdouble **dataOut)
{
GLdouble *vertex;
if(gluptr == NULL)
{
gluptr = (GLdouble *) malloc(6 * sizeof(GLdouble));
}
vertex = (GLdouble*)gluptr;
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;
}
基本上不是每次在循环中做malloc(因此内存泄漏)我使用全局指针,但这不起作用(绘制到屏幕不工作)这意味着dataOut没有接收我的指针指向的顶点数据。 为什么在函数中创建的指针使用malloc的工作方式与全局变量不同?
谢谢
您只分配一次数据 - 但GLUtesselator一次只需要一组数据!
你在这里做的是将所有顶点数据放在内存中的一个位置,在原始代码中,每个顶点都有内存。 GLUtesselator需要多个顶点才能正常运行。
你打电话
void gluDeleteTess(GLUtesselator *tessobj);
......之后,你呢?
最有可能的原因是,回调之外的某些东西会在对combineCallback()的调用中保留返回的数据,而后来对combineCallback()的调用现在来自旧调用的数据。
看一下代码,你需要重写一下,有一些错误,它表明固有缺乏理解指针和使用dataOut
by-reference参数如dataOut
,其次,没有检查对malloc
的调用可能会失败和会失败,代码盲目假设内存可用,第三,你必须使用诸如冗余指针变量vertex
和gluptr
的一个原因。 您实际上是通过将内容从gluptr
复制到vertex
来构建内存块,并使用'GLDouble'数据类型的coords
指针到块,然后构建内存的vertex
块...最后将它分配回dataOut
...如果我误解了,请原谅我,继续阅读......
这是已删除冗余变量的代码,如下所示,并修复了缺少检查NULL指针的问题。
GLdouble *gluptr = NULL; void CALLBACK combineCallback(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], GLdouble **dataOut) { if((*dataOut) == NULL) { (*dataOut) = (GLdouble *) malloc(6 * sizeof(GLdouble)); } if (*dataOut != NULL){ /* PASSED MEMORY ALLOC! */ (*dataOut)[0] = coords[0]; (*dataOut)[1] = coords[1]; (*dataOut)[2] = coords[2]; for (int i = 3; i < 6; i++) { (*dataOut)[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]; } } }
调用此函数时的最后一个参数combineCallback
是一个call-by-reference参数,因此使用了双星号..
我必须问一下, dataOut
肯定是固定大小的6个元素吗? 如果是这样那么参数需要调整......让它看起来像*(*dataOut[6])
...从头顶看它( 已经很晚了,经过我的睡觉时间...... )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.