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

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

В Си работать с динамической памятью можно при помощи соответствующих функций распределения памяти (calloc, malloc, free), для чего необходимо подключить библиотеку
malloc.h С++ использует новые методы работы с динамической памятью при помощи операторов new и delete:
  • new — для выделения памяти;
  • delete — для освобождения памяти.
Оператор new используется в следующих формах:
  • new тип; — для переменных
  • new тип[размер]; — для массивов
Память может быть распределена для одного объекта или для массива любого типа, в том числе типа, определенного пользователем. Результатом выполнения операции new будет указатель на отведенную память, или исключение std::bad_alloc в случае ошибки.
 
 
 
 
 
 
 
int *ptr_i;
double *ptr_d;
struct person *human;

ptr_i = new int;
ptr_d = new double[10];
human = new struct person;
Память, отведенная в результате выполнения new, будет считаться распределенной до тех пор, пока не будет выполнена операция delete. Освобождение памяти связано с тем, как выделялась память – для одного элемента или для нескольких. В соответствии с этим существует и две формы применения delete:
  • delete указатель; — для одного элемента
  • delete[] указатель; — для массивов
Например, для приведенного выше случая, освободить память необходимо следующим образом:
 
 
 
delete ptr_i;
delete[] ptr_d;
delete human;
Освобождаться с помощью delete может только память, выделенная оператором new. Пример Создание динамического массива
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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.

Пример неудачного выделения памяти (в случае очень большого требуемого объема):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main()
{
  int *p = 0;
  try
  {
    p = new int[1000000000];
  }
  catch(const bad_alloc& e)
  {
    cout << "Error: " << e.what() << "\n";
  }
  cout << p << endl;
  return 0;
}

Прокрутить вверх