【发布时间】:2017-05-26 02:44:41
【问题描述】:
我正在使用 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的函数,用来填充二维数组:
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;
我能想到的唯一可能的原因是当我调用 double **cn2;它已经指向某些东西,当我调用 cn2= new double*[noOfItem];它指向别的东西,原来的 **cn2 没有被释放?以前有没有其他人遇到过这个问题?真的很奇怪……用new分配的时候是不是必须写一行而不是2行?
【问题讨论】:
-
如果在 new 和 delete 之间发生了意想不到的事情会发生什么?泄漏。
-
使用智能指针的 10001 个理由...我建议您查找 std::shared_ptr 及其家族
-
@DKG 糟糕的建议
-
This has no memory leak。这是任何没有您的完整代码的人都必须从这里开始的地方。因此,除非您的内存报告工具是垃圾,否则您可能会破坏较大程序中其他地方的内存,并且它会影响您发布的代码。
-
@weeo - std::auto_ptr
已被弃用,我认为是因为它使许多人对某些用法感到困惑。也就是说,是的,如果您不打算复制它,它应该可以满足您的目的。
标签: c++ memory-leaks