Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Обнаружение ошибок, связанных с нехваткой памятиСодержание книги
Поиск на нашем сайте
При создании динамических переменных первым делом необходимо выяснить, достаточно ли свободной памяти. Если операция 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 с.) |