Выделение памяти без возбуждения исключения

В ранних версиях C++ при нехватке памяти возвращался нулевой указатель. Такая же ситуация возникает в языке C при использовании функции malloc(). Чтобы оператор new, возвращал нулевой указатель, а не возбуждал исключение используется следующий синтаксис:

<Указатель> = new (std::nothrow) <Тип данных>(<Начальное значение>);
<Указатель> = new (std::nothrow) <Тип данных>[<Количество элементов>];

Для использования nothrow требуется подключить файл new. После выделения памяти следует проверить указатель на отсутствие нулевого значения. Пример выделения памяти без возбуждения исключения приведен в листинге 3.16.

Листинг 3.16. Динамическое выделение памяти без возбуждения исключения

#include <iostream>
#include <new>
#include <clocale>
#include <process.h>

int main() {
   std::setlocale(LC_ALL, "Russian_Russia.1251");
   int *p = new (std::nothrow) int; // Выделяем память
   if (!p) {                        // Проверяем на корректность
      std::cerr << "Не удалось выделить память" << std::endl;
      exit(1);                      // Выходим при ошибке
   }
   *p = 20;                         // Пользуемся памятью
   std::cout << *p << std::endl;    // 20
   delete p;                        // Освобождаем память
   p = nullptr;                     // Обнуляем указатель
   return 0;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов