2017-01-11 2 views
0

Я использую 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 при использовании нового для выделения?

+1

Что произойдет, если что-то uexpected происходит между новой и удалить ? Утечка. –

+0

10001 причины использования интеллектуальных указателей ... Я предлагаю вам посмотреть std :: shared_ptr и его семейство – UKMonkey

+0

_ Единственная возможная причина, по которой я мог подумать, - это когда я называю double ** cn2; он указывает на что-то уже. Ну .. Это указывает на мусор, а не на допустимое значение, которое нужно будет освободить. –

ответ

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 
0 Техника

Debugging: -

Использование визуальной студии, чтобы найти памяти, связанные с ошибкой Buffer Overflow explained

диагностический инструмент Используйте

Vld и параллельно студия

+0

«shared_ptr». Считается, что «умный указатель» ... «Да, но идеология за ним подразумевает, что его следует использовать меньше, чем вы могли бы подумать. Хорошая дискуссия здесь: http://stackoverflow.com/questions/8706192/which-kind-of-pointer-do-i-use-when – user4581301

 Смежные вопросы

  • Нет связанных вопросов^_^