Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

if (p0) // проверка корректности указателя p0; эквивалентно p0!=0

Мы предпочитаем более короткую форму проверки, полагая, что она точнее отражает смысл выражения “
p0
корректен”, но это дело вкуса.

Нулевой указатель следует использовать тогда, когда некий указатель то ссылается на какой-нибудь объект, то нет. Эта ситуация встречается реже, чем можно себе представить; подумайте: если у вас нет объекта, на который можно установить указатель, то зачем вам определять сам указатель? Почему бы не подождать, пока не будет создан объект?

17.4.6. Освобождение свободной памяти

Оператор

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

double* calc(int res_size, int max) // утечка памяти

{

double* p = new double[max];

double* res = new double[res_size];

// используем указатель p для вычисления результатов

// и записи их в массив res

return res;

}

double* r = calc(100,1000);

В соответствии с этой программой каждый вызов функции

calc
будет забирать из свободной памяти участок, размер которого равен размеру типа
double
, и присваивать его адрес указателю
p
. Например, вызов
calc(100,1000)
сделает недоступным для остальной части программы участок памяти, на котором могут разместиться тысяча переменных типа
double
.

Оператор, возвращающий освобождающую память, называется

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

double* calc(int res_size, int max)

// за использование памяти, выделенной для массива res,

// несет ответственность вызывающий модуль

{

double* p = new double[max];

double* res = new double[res_size];

// используем указатель p для вычисления результатов и их

// записи в res

delete[ ] p; // эта память больше не нужна: освобождаем ее

return res;

}

double* r = calc(100,1000);

// используем указатель r

delete[ ] r; // эта память больше не нужна: освобождаем ее

Между прочим, этот пример демонстрирует одну из основных причин использования свободной памяти: мы можем создавать объекты в функции и передавать их обратно в вызывающий модуль.

Оператор

delete
имеет две формы:

•

delete p
освобождает память, выделенную с помощью оператора
new
для отдельного объекта;

•

delete[] p
освобождает память, выделенную с помощью оператора
new
для массива объектов.

Выбор правильного варианта должен сделать программист.

Двойное удаление объекта — очень грубая ошибка. Рассмотрим пример.

int* p = new int(5);

delete p; // отлично: p ссылается на объект, созданный оператором new

// ...указатель здесь больше не используется...

delete p; // ошибка: p ссылается на память, принадлежащую диспетчеру

// свободной памяти

Вторая инструкция

delete p
порождает две проблемы.

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

delete p
правильно во второй раз было невозможно.

• Диспетчер свободной памяти может повторно использовать память, на которую ссылался указатель

p
, так что теперь указатель
p
ссылается на другой объект; удаление этого объекта (принадлежащего другой части программы) может вызвать ошибку.

  • Читать дальше
  • 1
  • ...
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: