Re: Динамические массивы, освобождение памяти
От: rg45 СССР  
Дата: 16.02.08 09:59
Оценка: +1
Здравствуйте, piero_, Вы писали:

_>как освободить память, если у меня 4-мерный динамический массив, выделяю память я так:


_> int **** Grid11;

_> int Range1, Range2;

_> Grid11 = new int***[Range1];

_> for(i1 = 0; i1 < Range1; i1++)
_> {Grid11[i1] = new int**[Range1];
_> for(i2 = 0; i2 < Range1; i2++)
_> {Grid11[i1][i2] = new int*[Range2];
_> for(i3 = 0; i3 < Range2; i3++)
_> {Grid11[i1][i2][i3] = new int[Range2];
_> memset(Grid11[i1][i2][i3],0, sizeof(int)*(Range2));
_> }
_> }
_> }

_>Спасибо


Ответ Егора хочу дополнить подсказкой. Если в этом примере использовать класс std::vector из стандартной библиотеки, то забота об освобождении памти отпадает автоматически:
#include <iostream>
#include <vector>

int main()
{
  using namespace std;

  typedef vector<int> V1;
  typedef vector<V1> V2;
  typedef vector<V2> V3;
  typedef vector<V3> V4;

  int Range1 = 20, Range2 = 10;

  //Создаем четырехмерный массив целых, заполненный нулями.
  V4 Grid11(Range1, V3(Range1, V2(Range2, V1(Range1)))); 

  //Создаем такой же четырехмерный массив, заполненный единицами.
  V4 Grid22(Range1, V3(Range1, V2(Range2, V1(Range1, 1)))); 

  //Работаем, как с обычными встроенными массивами
  Grid11[1][2][3][4] = 1234; 
  Grid22[4][3][2][1] = 4321; 
  
  cout << Grid11[1][2][3][4] << endl;
  cout << Grid22[4][3][2][1] << endl;

  /*...*/
}


При выходе из функции main память, выделенная для объектов Grid11 и Grid22, будет освобождена автоматически. Кроме того, твой код приобрет устойчивость по отношению к возможным исключениям — память освободится даже в этом случае. И, что очень важно, сравни эти два варианта кода, какой из них легче прочитать и проще понять?
... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.