Оператор new позволяет выделить память
под динамический объект (т.е. объект,
создаваемый в процессе выполнения
программы). Существует несколько форм
записи оператора new, в зависимости от
того нужно ли выделить память под одиночный
объект или под массив объектов:
new type
new type [size]
где type - тип данных, для которых выделяется
память, size - размер массива.
Инициализация при выделении памяти для динамических массивов не выполняется.
Оператор delete используется для
удаления динамических объектов, память под
которые была предварительно выделена с
помощью оператора new. Оператор delete
имеет две формы записи, в зависимости от
того удаляется ли одиночный объект или
массив объектов:
delete pointer
delete [] pointer
где pointer - указатель на удаляемый объект или начало удаляемого
массива
Динамически можно создавать и многомерные массивы, но только первый (самый левый) размер массива может быть задан с помощью переменной. Остальные размеры должны быть константами. Поэтому при создании многомерных динамических массивов используются массивы указателей. Например, для динамического создания двумерного массива размера M*N сначала создается массив указателей размера M, а затем для каждого из указателей этого массива создается создается по одномерному массиву размера N.
int **m = new int * [M];
for (int i = 0; i < M; i++)
{
m[i] = new int [N];
}
Далее можно обращаться к элементам созданного массива как к элементам обычного статического массива, т.е. например m[i][j], где i=0,...,M-1, а j=0,...,N. При этом, сначала обращаются к адресу, который содержится в переменной m (это начало массива указателей), затем переходят к i-ому элементу массива указателей m[i], в котором содержится адрес начала i-ого одномерного массива. И лишь после этого переходят к j-му элементу i-го одномерного массива, который и будет элементом m[i][j].
После того как динамический массив стал ненужным необходимо освободить занимаемую им память. При этом необходимо помнить, что каждому оператору new должен соответствовать (причем единственный) оператор delete.
for (int i = 0; i < M; i++)
{
delete [] m[i];
}
delete [] m;
Выполнение работы рекомендуется разбить на 4 шага: