在多次调用的函数中声明指针

Declare pointer inside a function that is called several times

我想知道我是否可以使用在 opengl 中多次调用的函数 Idle() 来做到这一点 program.Is 这没问题还是会发生内存泄漏?

void Idle()
{
    //PXCPointF32 is a struct
    PXCPointF32 *uvmap=0;

    uvmap=new PXCPointF32[640*480];
    if(uvmap!=NULL)
    {
       //do some processing
       //fill uvmap values
    }

    if (uvmap) 
    {
        delete[] uvmap;
        uvmap=NULL;
    }
}

没有内存泄漏的原因。但这并不是真正的美术编程。在这种情况下,我宁愿在程序开始时保留一次内存并将其保留到程序结束以避免内存碎片和速度损失。 该代码还有一些 "cargo" 行:

void Idle()
{
//PXCPointF32 is a struct
PXCPointF32 *uvmap=new PXCPointF32[640*480];

if(uvmap==NULL)
{
  // panic and return 
}

//do some processing
//fill uvmap values

delete[] uvmap;
//    uvmap=NULL;  out of scope anyway
}

除非在delete之前和new之后抛出异常,否则不会泄漏。使用智能指针可以防止这种情况。

代码应该可以工作,但不是最优的:

void Idle()
{
    //PXCPointF32 is a struct
    PXCPointF32 *uvmap=0; // why initialize to 0 only to replace its value?

    uvmap=new PXCPointF32[640*480];
    if(uvmap!=NULL)
    {
       //do some processing
       //fill uvmap values
    }

    if (uvmap) // no need to test for null before deleting
    {
        delete[] uvmap;
        uvmap=NULL; // no point setting to NULL because its local
    }
}

相反你可以这样做:

void Idle()
{
    // set it directly
    PXCPointF32* uvmap = new PXCPointF32[640*480];

    if(uvmap)
    {
       //do some processing
       //fill uvmap values
    }

    delete[] uvmap; // don't bother checking for null (delete[] does that)
}

你可能还想考虑一个智能指针来在异常情况下清理内存:

void Idle()
{
    // set it directly
    std::unique_ptr<PXCPointF32[]> uvmap(new PXCPointF32[640*480]);

    if(uvmap)
    {
       //do some processing
       //fill uvmap values
    }

    // no delete[] here
}

我想这个函数是作为 GUI 线程的一部分调用的。这意味着我不需要担心多个线程同时访问这个函数。

那么让我们静态分配内存吧。

void Idle()
{
    //PXCPointF32 is a struct
    static PXCPointF32 uvmap[640*480];

    //do some processing
    //fill uvmap values
}

这段代码不会泄漏内存(因为它没有分配任何内存)。您的代码也没有问题,只要 Idle() 中没有任何内容会引发异常。