Распределение динамической памяти

Операция new

Использование операции new является одним из способов, как определить значение переменной указателя (другие способы смотри в §2). В простейшем случае синтаксис применения этой операции такой:

указатель=new имя_типа;

Например, пусть объявлена переменная-указатель float *p;. Тогда операция

p=new float;

выделяет и делает доступным свободный участок динамической памяти, размер которого соответствует типу данных, определяемому именем типа. В нашем примере резервируется память размером 4 байта для размещения одного вещественного числа. Кроме этого, в случае успешного выполнения операция new возвращает адрес начала выделенного участка. Значение этого адреса присваивается переменной- указателю (в примере переменной p). Но значение выделенной ячейки, которое в программе обозначается *p, после выполнения этой операции ещё не определено. Поэтому cout<<(*p) выведет случайное число. Для задания значения *p надо выполнить, например, ввод (cin >> (*p);), или использовать другой способ (присваивание, получение с помощью функции и т.п..). Напомним, что cin>>p; приводит к ошибке.

Если участок нужных размеров не может быть “найден”, то операция new возвращает нулевое (точнее, неопределённое) значение адреса, которое в программе обозначается константой NULL, которая записывается обязательно большими буквами. Тогда в программе можно записать

if (p==NULL) { cout<<”\nError”; exit(0);}

Как нулевое числовое значение, так для указателей значение NULL равносильно false в операциях сравнения. Поэтому последнее условие в if равносильно

if (!p) {cout<<”\nError”; exit(0);}

С помощью рассматриваемой операции new можно проинициализировать не только значение указателя, но и задать значение выделенной ячейки памяти. В таком случае операция применяется так:

указатель=new имя_типа(значение);

Например,

p=new float(4.1);

определяет как значение указателя p, так и значение *p. Это равносильно

p=new float; *p=4.1;

Заметим, что значение записывается в круглых, а не в квадратных скобках. Последние будем позже использовать для создания динамического массива. Но динамический массив так инициализировать нельзя! (см.глава 2).

Доступ к переменной, адрес которой находится в p, как и раньше, осуществляется с помощью той же операции “*” (разыменование). Поэтому

cout<<p<<” “ <<(*p);

выведет адрес в 16-й системе счисления и число 4.1.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: