通过指针,内存泄漏

时间:2012-09-13 06:11:55

标签: c++ visual-studio-2010 pointers

注意:最初我虽然有一部分代码导致泄漏,但结果证明是错误的。因此下面的评论。我已更新了问题

可能的解决方案: 我设法解决了这个问题。我所做的是将所有初始化移动到函数的头部。当我看到相应的删除代码时,将它们列在一张纸上并刮掉它们。这条路 我没有错过任何删除 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

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

1 个答案:

答案 0 :(得分:0)

我认为你的问题不是指针,而是引用,你使用双指针分配2D数组,并在你的代码中:

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);时,它将取消分配内存但不会被取消,因为它在代码中作为副本传递