Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Операторы new и delete. Константа NULL



Рассмотрим фрагмент программы:

int num=4, *ptr_a;

ptr_a=#

Можно считать, что после выполнения ptr_a=&num у переменной num появляется еще одно имя – *ptr_a. Часто в программах бывает удобно пользоваться переменными, у которых есть только такие имена – динамическими переменными. Независимых имен у них нет. К динамическим переменным можно обращаться только через указатели с помощью операции разыменования (например, *ptr_a).

Динамические переменные "создаются" с помощью оператора распределения динамической памяти new, а "уничтожаются" (т.е. занимаемая ими память освобождается для дальнейшего использования) с помощью оператора delete. Действие этих операторов показано в программе.

#include <stdio.h>

void main()

{

int *ptr_a, *ptr_b; /* СТРОКА 4 */

ptr_a = new int; /* СТРОКА 5 */

*ptr_a = 4; /* СТРОКА 6 */

ptr_b = ptr_a; /* СТРОКА 7 */

printf("%d %d\n",*ptr_a, *ptr_b);

ptr_b = new int; /* СТРОКА 9 */

*ptr_b = 7; /* СТРОКА 10 */

printf("%d %d\n",*ptr_a, *ptr_b);

delete ptr_a;

ptr_a = ptr_b; /* СТРОКА 13 */

printf("%d %d\n",*ptr_a, *ptr_b);

delete ptr_a; /* СТРОКА 15 */

}

Программа выводит на экране следующие сообщения:

4 4

4 7

7 7

На рисунках 3-7 показаны состояния программы после выполнения 4-й, 5-7-й, 9-10-й, 13-й и 15-й строк.



Рис. 3. Состояние программы после выполнения 4-й строки с описаниями переменных

Рис. 4. Программа после выполнения операторов присваивания в 5-й, 6-й и 7-й строках



Рис. 5. Программа после выполнения операторов присваивания в 9-й и 10-й строках

Рис. 6. Программа после выполнения оператора присваивания в 13-й строке


Рис. 7. Программа после выполнения оператора delete в 15-й строке

Состояния на рис. 3 и рис. 7 похожи тем, что значения указателей ptr_a и ptr_b не определены, т.е. они указывают на несуществующие объекты. Обратите внимание, что указатель ptr_b в конце программы оказывается в неопределенном состоянии, хотя при вызове оператора delete этот указатель явно не передавался.

Если указатель ptr указывает на несуществующий объект, то использование в выражениях значения *ptr может привести к непредсказуемым (и часто катастрофическим) результатам. К сожалению, в Си++ нет встроенного механизма проверки несуществующих указателей. Программист может сделать свои программы более безопасными, если всегда будет стараться присваивать несуществующим указателям нулевой адрес (символическое имя нулевого адреса – NULL). Для хранения переменных в Си++ нулевой адрес не используется.

Константа NULL (целое число 0) описана в библиотечном заголовочном файле stddef.h. Значение NULL можно присвоить любому указателю. Например, в программе для защиты от использования неопределенных указателей *ptr_a и *ptr_b можно добавить следующие строки:

#include <stdio.h>

#include <stddef.h>

...

...

delete ptr_a;

ptr_a = NULL;

delete ptr_b;

ptr_b = NULL;

...

...

if (ptr_a!= NULL)

{

*ptr_a =...

...

...

В случае, если для создания динамической переменной не хватает свободной оперативной памяти, то после вызова new Си++ автоматически присвоит соответствующему указателю значение NULL. В показанном ниже фрагменте программы этот факт используется для организации типичной проверки успешного создания динамической переменной.

#include <stdio.h>

#include <stdlib.h> /* exit() описана в файле stdlib.h */

#include <stddef.h>

...

ptr_a = new int;

if (ptr_a == NULL)

{

printf("Извините, недостаточно оперативной памяти.\n");

exit(1);

}

...





Дата публикования: 2015-01-23; Прочитано: 275 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...