繁体   English   中英

为什么这不起作用?

[英]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的调用可能会失败和失败,代码盲目假设内存可用,第三,你必须使用诸如冗余指针变量vertexgluptr的一个原因。 您实际上是通过将内容从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM