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