Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

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

13: set_new_handler(0); // Указание new вернуть 0 в случае неудачи

14: for (;;) { // Повторять следующий оператор "без конца"

15: qp = new q; // Выделить новую структуру типа q

16: cout «qp«'\n'; // Вывести адрес структуры

17: if (qp == 0) { // В случае возврата new 0 следует:

18: cout «"Out of memory\n"; // Вывести сообщение об ошибке

Exit(1); // Прервать программу с кодом завершения 1

20: }

21: }

22: return 0;// В этой строке выдается предупреждение "unreachable code"

23: }

В качестве программных данных в строках 5-7 объявляется структура с массивом 1,024 целых значений. При обработке этой структуры new вьаделяет 2,048-байтовый блок (учитывая тот факт, что целое значение за­нимает два байта). Повторяя эту операцию до бесконечности, программа исчерпывает запасы свободной памя­ти, демонстрируя, что случается, когда new не может выделить ее достаточно.

Чтобы new возвращал нуль в случае ошибки, программа передает 0 функции set_new_handler(). После этого "бесконечный" цикл for выполняет несколько операторов. Первый из них вызывает new для выделения 2048-байтовой структуры и присваивает ее адрес указателю qp. Далее оператор вывода отображает адрес, хра­нящийся в qp. Если qp — нуль, то это означает, что new не сумел выделить достаточно памяти, программа выводит сообщение об ошибке и затем аварийно завершает выполнение с помощью вызова функции exit(). Вот что отобразилось на дисплее при запуске этой программы (адреса могут отличаться от тех, что будут вы­ведены на вашем экране):

0x1366 0x1b8a

0x0000

Out of memory

Если программа не вызывает set_new_handler(), new возбуждает исключительную ситуацию вместо того, чтобы вернуть нуль. Для демонстрации этого отличия, закомментируйте или удалите оператор set_new_handler(), скомпилируйте программу заново и запустите ее. Теперь программа выведет:

0x1366 0x1b8a

0x0000

Abnormal program termination

В предыдущем тесте программа самостоятельно обнаружила ошибку, связанную с нехваткой памяти, и ава­рийно завершилась с помощью вызова функции exit(). В новом тесте new возбудил исключительную ситуа­цию, которая явилась причиной аварийного завершения.



Поделиться:


Последнее изменение этой страницы: 2016-08-01; просмотров: 158; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.89.152 (0.006 с.)