Я использую Xcode и инструменты, чтобы найти свою утечку памяти, он жалуется, что следующий код создает утечку памяти:странно C++ утечки памяти из 2D массива
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;
я могу думать только о том, что когда я называю double ** cn2; он указывает на что-то уже и когда я вызываю cn2 = новый double * [noOfItem]; он указывает на что-то еще, а оригинал ** cn2 не освобождается? Кто-нибудь еще сталкивался с этой проблемой раньше? Это действительно странно ... Должен ли я писать их в одной строке вместо 2 при использовании нового для выделения?
Что произойдет, если что-то uexpected происходит между новой и удалить ? Утечка. –
10001 причины использования интеллектуальных указателей ... Я предлагаю вам посмотреть std :: shared_ptr и его семейство – UKMonkey
_ Единственная возможная причина, по которой я мог подумать, - это когда я называю double ** cn2; он указывает на что-то уже. Ну .. Это указывает на мусор, а не на допустимое значение, которое нужно будет освободить. –