Возможные ошибки при работе с динамической памятью
Некорректная работа с динамической памятью чревата серьезными ошибками. Одну из них мы обсудили ранее. Это ошибка связанна с возможным переполнением динамической области памяти, когда после окончания использования динамических данных мы “забываем” освободить память с помощью инструкции delete или функции free. Обнаружение подобных ошибок с целью предотвращения неправильной работы программы зависит от средств, используемых для выделения памяти.
При неудачной попытке выделить память с помощью инструкции new возникает так называемая исключительная ситуация (или исключение). Обработкой исключений в C++ занимается специальная подсистема обработки исключительных ситуаций, использование и изучение которой выходит за рамки настоящего курса лекций. Впрочем, подобные ошибки в рассматриваемых нами примерах и программах вряд ли будут возникать.
Поведение функций malloc и calloc с точки зрения обнаружения таких ошибок более “разумно”. В случае невозможности выделить требуемый объем памяти в динамической области эти функции возвращают нулевой указатель. Контролируя это значение можно избежать ошибок в работе программы:
double *p = (double *) malloc (sizeof (double) ); //Пытаемся выделить память
if ( !p )// Память выделить не удалось
{
// Принимаем меры по исправлению ситуации
}
// Продолжаем работу
Однако имеется другой вариант инструкции new, который работает так же, как и функции malloc и calloc(также возвращает нулевой указатель). Вот как его использовать:
double *p = new ( nothrow ) double; //Пытаемся выделить память
if ( !p )// Память выделить не удалось
{
// Принимаем меры по исправлению ситуации
}
// Продолжаем работу
Другая категория ошибок называется “утечкой памяти”. Например:
int * p;// Объявляем указатель на целый тип данных
p = new int;// Выделяем память по некоторому адресу p
………
p = new int;// Еще раз выделяем память, и ее адрес записываем опять в p
В этом примере повторное присвоение переменной pдругого адреса нового участка памяти приводит к потере адреса участка памяти, выделенного первой инструкцией new. Этот “забытый” участок памяти будет занят до конца работы программы, и его нельзя ни освободить, ни использовать для хранения данных – говорят, что произошла утечка памяти. Такие “утечки” могут привести к тому, что опять произойдет переполнение динамической области памяти. Для недопущения подобных ошибок необходимо внимательно следить за своевременным освобождением памяти, на которую ссылается переменная-указатель.
Еще одна категория ошибок связана с попытками обращения к динамической памяти через указатели, не инициализированные с помощью инструкции new и функциями malloc и calloc, а также при попытке обращения к динамической памяти через указатель после освобождения памяти с помощью инструкции delete или функции free.
Дата добавления: 2019-02-07; просмотров: 369;