Как удалить этот двумерный массив указателей?Создание деструктора - PullRequest
1 голос
/ 10 марта 2012
malla = new Celula**[n + 2];  
for(int i = 0 ; i < n + 2 ; ++i){  
     malla[i] = new Celula*[m + 2];
     for(int j = 0 ; j < m + 2 ; ++j){
         malla[i][j] = new Celula[m];
     }
}

Я делаю этот код и выделяю память следующим образом (я хочу массив указателей n*m для Celula, хорошо? Теперь мне нужен деструктор.

Теперь я не знаю, как получить доступ к объекту в этом массиве и:

malla[i][j].setestado(true);

не работает.

Ответы [ 2 ]

5 голосов
/ 10 марта 2012

Не используйте указатели .

std::vector<std::vector<Celula> > malla(n, std::vector<Celula>(m));

// …
malla[1][2].setestado(true);

Upshot: одна строка вместо семи, более простое использование, delete не требуется нигде.

Кроме того, в коде принято использовать английские идентификаторы. Если это ничто иное, то преимущество в том, что люди могут помочь вам лучше, если они не говорят на одном языке с вами.

3 голосов
/ 10 марта 2012

Серьезно прислушайтесь к совету @ konrad's.Если в любом случае вы хотите использовать необработанные массивы, вы можете сделать:

Для освобождения:

 for(int i = 0 ; i < n + 2 ; ++i)
 {
 for(int j = 0 ; j < m + 2 ; ++j) delete[] malla[i][j] ;
 delete[] malla[i];
 }
 delete[] malla;

Для доступа к объекту:

 malla[i][j][_m].setestado(true);

Редактировать:

если malla[i][j] является указателем на просто объект, то деструктор / освобождение будет выглядеть так:

 for(int i = 0 ; i < n + 2 ; ++i)
 {
 for(int j = 0 ; j < m + 2 ; ++j) delete malla[i][j] ;
 delete[] malla[i];
 }
 delete[] malla;

Доступ к объекту / члену может быть выполнен как: (*malla[i][j]).setestado(true); или malla[i][j]->setestado(true);

...