Обнаружение ошибок, связанных с нехваткой памяти
При создании динамических переменных первым делом необходимо выяснить, достаточно ли свободной памяти. Если операция new завершилась успешно, результатом ее является указатель на зарезервированную память требуемого размера. В случае неудачного завершения возможны две ситуации: • new возбуждает исключительную ситуацию; • new возвращает нуль. В старых версиях С++ оператор new в любом случае возвращал нуль в случае неудачной попытки выделения памяти, обычно вследствие нехватки свободного пространства. В новейших версиях C++ спецификации языка позволяют new возбуждать исключительную ситуацию. Пока вы не узнаете больше о С++, преждевременно говорить об исключительных ситуациях, и лучше использовать new как и ранее, перепрограммировав его так, чтобы в случае ошибки выделения памяти возвращался нуль. Для этого включите заголовочный файл NEW.H в вашу программу и добавьте следующий оператор в main() или в любое другое место до первого использования new: set_new_handler(0); Функция set_new_handler() устанавливает адрес обработчика (подпрограммы времени исполнения), используемой new. Обработчик по умолчанию заставляет new возбуждать исключительную ситуацию для ошибок.
При переносе имеющихся программ на С++ в среду Borland C++ 4.5, возможно, будет необходимо вызвать set__new_handler(0) вначале программы для обеспечения ее правильной работы, Это изменение следует внести в программу в том случае, если она непредвиденно завершится с сао6щением"аbnоrma1 termination" (аварийное завершение), которое может быть вызвано возбуждением new исключительной ситуации в случае ошибки выделения памяти.
Листинг 1.10 поясняет, как использовать new для выделения памяти для структур, а также демонстрирует, что происходит, когда программе не хватает свободной памяти. Вы можете скомпилировать и запустить программу как EasyWin-приложение из интегрированной оболочки или же из командной строки DOS. B обоих случаях компилятор выдаст предупреждение "Unreachable code" (Недостижимый код). (В следующем разделе разъяснено, в каких случаях выдается это предупреждение.)
Листинг 1.10. MEMERR.CPP (демонстрация new и ошибок, связанных с нехваткой памяти) 1: #include <iostream.h> 2: #include <new.ti> 3: #include <stdlib.h> 4: 5: struct q { 6: int ia[1024]; // 2048-байтовая структура 7: }; 8: Main() 10:{ 11: struct q *qp; // Указатель на структуру q 12: ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|