3

注意:最初我认为一段代码导致了泄漏,但事实证明这是不正确的。因此下面的评论。我已经更新了问题

可能的解决方案:我设法解决了这个问题。我所做的是将所有初始化移动到函数的头部。当我遇到相应的删除代码时,将它们列在一张纸上并刮掉它们。这样 1. 我没有遗漏任何删除 2. 确保我没有在循环内初始化任何内容 管理以消除除了几个字节之外的所有泄漏。更新代码:http ://sharetext.org/gPJf 您可以在下面找到“之前”代码:


我面临错误的功能是这个: http ://sharetext.org/3gq0

从我收集的评论中,初始化和删除可能不正确。这是负责品尝的代码

float** CMemAlloc::init_2Dfloat(int rows,int cols)
{
    float **a;
    a=new float*[rows];
    for(int j=0;j<rows;j++)
        a[j]=new float[cols];

    for(int i=0;i<rows;i++)
        for(int j=0;j<cols;j++)
            a[i][j]=0.0;

    return a;

}



void CMemAlloc::del_float(float **a,int rows)
{
    if(a!=NULL)
    {
        for (int i = 0; i <rows; i++) {
            delete[] a[i];
            a[i] = NULL;

        }
        delete[] a;
        a=NULL;
    }
    else
    {
        return;
    }

}

我怀疑这个功能对出现故障:

CCoarseFun::window** CCoarseFun::init_2Dwin(int rows,int cols)
{
    window** a;

    a=new window*[rows];
    for(int j=0;j<rows;j++)
        a[j]=new window[cols];

    for(int i=0;i<rows;i++)
    {
        for(int j=0;j<cols;j++)
        {
            a[i][j].line_high=0;
            a[i][j].line_low=0;
            a[i][j].pixel_high=0;
            a[i][j].pixel_low=0;
        }
    }
    return a;
}

void CCoarseFun::del_win(window ** a, int rows)
{
    for(int i=0;i<rows;i++)
    {
        delete [] a[i];
        a[i] = NULL;
    }
    delete[] a;
    a=NULL;
}

这里会不会有错误?

注意:我已经在各个点放置了跟踪语句,并且正在打印“块”的地址。这是输出:http ://sharetext.org/ODSv

我目前正在尝试的是从内部循环中删除所有初始化。

4

1 回答 1

0

我认为您的问题不在于指针,而在于引用,您正在使用双指针来分配二维数组,并且在您的代码中:

void CCoarseFun::del_win(window ** a, int rows)

window不是指针传递的,是值传递的指针

要解决这个问题,你只需要通过引用传递它,

void CCoarseFun::del_win(window ** &a, int rows)

这里也..

void CMemAlloc::del_float(float ** &a,int rows)

在您的代码中一切正常,但是当您这样做时CCoarseFun::del_win(a,rows);,它将取消分配内存但 a 不会被取消,因为它作为副本在您的代码中传递

于 2013-06-16T08:06:40.647 回答