Работа с динамическими переменными

До настоящего момента в рассмотренных примерах мы рассматривали указатели, которые указывали на уже существующие переменные. Но очень часто указатели используются для работы с динамическими переменными – переменными, которые могут создаваться и уничтожаться в процессе работы программы.

В этом случае все необходимые операции по созданию и удалению таких переменных должен выполнять программист. Он несет полную ответственность за корректную работу таких указателей.

Рассмотрим следующий пример:

int *pV;

*pV = 10;

С точки зрения компилятора все корректно: pV – это указатель на ячейку памяти, предназначенную для хранения значения типа int, 10 – это целое.

Но мы объявили не инициализированный указатель, это значит, что адрес, хранящийся в указателе pV, может указывать на случайную ячейку памяти (в том числе и на ту, которая может быть занята другой переменной).

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

Для того чтобы указанная операция была выполнена корректна, необходимо выполнить дополнительную операцию:

pV = new int;

*pV = 10;

Оператор new выделит память, необходимую для размещения значения типа int, и вернет адрес этой ячейки памяти.

Важно помнить, что память под переменные, выделенные оператором new, не освобождается автоматически. Если программист только выделяет память и не освобождает ее после завершения использования, то имеет место «утечка памяти», она опасна в случае долго работающих программ или программ, работающих с большими объемами данных. Поэтому память, выделенная при помощи new, должна быть освобождена при помощи delete:

delete pV;

1. 8. Основные выводы:

int x; //объявление переменной целого типа

int* p; //объявление указателя на переменную целого типа

p = &x; //присвоить p адрес переменной x

x = *p; //присвоить x значение, которое находится по адресу, сохраненному в p



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



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