Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Рассмотрим фрагмент программы:
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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!