我正在使用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?
答案 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和并行工作室