Язык С++ имеет два оператора, которые выполняют работу по выделению и освобождению памяти :
· Оператор new выделяет необходимую память из «кучи».
Формат оператора : Переменная-указатель = new тип_переменной;
· Оператор deleteосвобождает ранее выделенную динамическую память (возвращает ее в «кучу»).
Формат оператора : delete переменная-указатель;
Язык С++ позволяет инициализировать динамическую память в момент её выделения из «кучи», для этого начальное значение, которое нужно присвоить при инициализации заключается в круглые скобки.
Формат оператора :
Переменная-указатель = new тип_переменной (?);
Пример1. Статическое распределение памяти под переменные.
Память под переменные x,y и z выделяется при трансляции, к ним можно обращаться по именам, так как адреса переменных фиксированы.
#include <iostream>
#define n 100
using namespace std;
void main()
{ int x,y;
double z;
x=n;
do
{
cout<<"y=";
cin>>y;
}
while(!y);
z=double(x)/y;
cout<<"\nz="<<z<<'\n';
}
В следующем примере память, необходимую для переменных x и y, выделим динамически, то есть в момент работы программы.
Пример2. Под две переменные типа int память выделяется динамически (числитель и знаменатель дроби. Результат вычисления записывается в статическую переменную z.
#include <iostream>
using namespace std;
void main()
{ int *p_x,*p_y; // определить указатели p_x и p_y
double z;
p_x=new int() ; /* выделить динамическую память под переменную типа int и записать её адрес в указатель p_x*/
p_y=new int(); /* выделить дин. память (адрес в указателе p_y)*/
cout<<"x=";
cin>>*p_x; // ввести данные с клавиатуры в динамическую переменную
do// ввести ненулевые данные с кл-ры в динамическую переменную
{
cout<<"y=";
cin>>*p_y;
}
while(!*p_y);
z=double(*p_x)/(*p_y);
cout<<"\nz="<<z<<'\n';
delete p_x; // освободить динамическую память
delete p_y;
system ("pause"); // задержка экрана
}
Память под переменную z выделяется при трансляции, поэтому к ней можно обращаться по имени. Память под переменные для числителя и знаменателя дроби, выделяется динамически и, поэтому эти данные не имеют имён , так как их адреса в момент трансляции неизвестны. К этим переменным можно обращаться только через указатели, в нашем примере – это указатели p_x и p_y.