Лабораторная работа №16

Использование динамических массивов

Теория

Динамическое выделение памяти

Оператор 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 шага:

  1. Выделение памяти под динамический массив.
  2. Заполнение массива вычисленными значениями.
  3. Печать полученной матрицы
  4. Освобождение использованной памяти.

Исходный файл примера

Lab16.cpp

Задание

Здесь можно взять варианты заданий к лабораторной работе.