来自2D阵列的奇怪的C ++内存泄漏

时间:2017-01-11 10:43:04

标签: c++ memory-leaks

我正在使用xcode和工具来查找我的内存泄漏,它抱怨下面这段代码会造成内存泄漏:

double **cn2;
cn2= new double*[noOfItem];
for(int i=0;i<noOfItem;i++)
{
    cn2[i]=new double[noOfItem];
}
for(int i=0;i<noOfItem;i++)
{
    for(int j=0;j<noOfItem;j++)
    {
        cn2[i][j]=getCN2(noOfItem,i,j,pearson,cn2CutOff);
        //cout<<i<<" "<<j<<" "<< cn[i][j]<<endl;
    }

}
for(int i=0;i<noOfItem;i++)
{
    delete [] cn2[i];
}
delete [] cn2;

这是getCN2的功能,它用于填充2d数组:

double getCN2(int _isize,int _i1,int _i2,double **sim,double _cutoff)
{
    //cout<< med<<" "<<med1<<endl;
    int count=0;

    for(int i=0; i<_isize; i++)
    {
        //if(sim[_i1][i]>_cutoff && sim[_i2][i]>_cutoff)
        if(sim[_i1][i]>sim[_i1][_i2] && sim[_i2][i]>sim[_i1][_i2] && sim[_i1][_i2]>0)
        {
            count++;
        }
    }
    //cout << rez/sqrt(rez1*rez2) <<endl;
    return count;
}

如果我将代码更改为:

,则没有内存泄漏
double **cn2= new double*[noOfItem];
for(int i=0;i<noOfItem;i++)
{
    cn2[i]=new double[noOfItem];
}
for(int i=0;i<noOfItem;i++)
{
    for(int j=0;j<noOfItem;j++)
    {
        cn2[i][j]=getCN2(noOfItem,i,j,pearson,cn2CutOff);
        //cout<<i<<" "<<j<<" "<< cn[i][j]<<endl;
    }

}
for(int i=0;i<noOfItem;i++)
{
    delete [] cn2[i];
}
delete [] cn2;

我能想到的唯一可能的原因是当我打电话给双** cn2时;它指向已经存在的东西,当我调用cn2 = new double * [noOfItem];它指向别的东西,原来的** cn2没有得到释放?有没有其他人遇到过这个问题?这真的很奇怪......当使用new分配时,我是否必须将它们写成一行而不是2?

1 个答案:

答案 0 :(得分:0)

防止编码以避免此类错误

指针初始化必须

double *ptr = nullptr;

在分配内存之前需要检查

if (nullptr==ptr) { ....}

如果您编写新代码,请避免使用原始指针

unique_ptr. Allows exactly one owner of the underlying pointer. 
shared_ptr. Reference-counted smart pointer. ...
weak_ptr. Special-case smart pointer for use in conjunction with shared_ptr

调试技巧: -

使用visual studio查找与内存相关的错误     Buffer Overflow explained

使用诊断工具

Vld和并行工作室