Здавалка
Главная | Обратная связь

Обнаружение ошибок, связанных с нехваткой памяти



При создании динамических переменных первым делом необходимо выяснить, достаточно ли свободной памяти. Если операция 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 Все права принадлежат авторам размещенных материалов.