Динамическое выделение памяти в C++: операторы new, delete

Начать взаимодействие с динамической памятью на языке программирования С можно при помощи необходимых функций, распределяющих и выделяющих динамическую память, такие как calloc, malloc, free. Для того, чтобы их применять, нужно подключить библиотеку malloc.h.

Язык С++ в свою очередь пользуется более новыми методами использования динамической памяти для конкретных целей — операциями new и delete.

  • new выполняет задачу выделения памяти;
  • delete выполняет освобождение памяти.

Форматы, в виде которых может использоваться оператор new.

  • new тип; — при взаимодействии с аргументами;
  • new тип[размер]; — при взаимодействии с массивами.

Распределение памяти может происходить как для конкретного объекта, так и для массивов любых типов, определённых пользователем в том числе. Результат работы данной операции new — это указатель на выделенную память или же, при ошибке программы, нулевой указатель.

int *ptr_i;
double *ptr_d;
struct person *human;

ptr_i = new int;
ptr_d = new double[10];
human = new struct person;

Более того, пока оператор delete не проделает свою работу, память, выделенная в результате действия оператора new, будет характеризоваться как распределенная.

То, каким образом выделялась память, для элемента или же для совокупности элементом, напрямую влияет на освобождение памяти. По этой причине используется несколько вариантов оператора delete:

  • delete указатель; — взаимодействует с элементом;
  • delete [] указатель; — взаимодействует с массивами.

К примеру, для случая, описанного выше, освободить память нужно так:

delete ptr_i;
delete[] ptr_d;
delete human;

Операция delete работает только тогда, когда память выделена оператором new.

Создадим произвольный динамический массив.

#include <iostream>
using namespace std;
int main()
{
int size;
int *dan;
system(«chcp 1251»);
system(«cls»);
cout << «Ввести размерность массива : «;
cin >> size;
dan = new int[size];
for (int i = 0; i<size; i++) {
cout << «dan[» << i << «] = «;
cin >> dan[i];
}
for (int i = 0; i<size; i++)
cout << dan[i] << » «;
delete[] dan;
cin.get(); cin.get();
return 0;
}

Результат работы программы.

Заключение

Базовым адресом распределяемого динамического массива считается указатель dan, а число элементов этого массива — size. При помощи операции delete память, распределенная при работе оператора new, освобождается.

Нет комментариев

Оставить комментарий