Namespaces
Variants

std::set_new_handler

С ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (основные типы, RTTI)
Макросы проверки функций библиотеки (C++20)
Утилиты программы
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
 
Библиотека управления памятью
Аллокаторы
Ресурсы памяти
Неинициализированная память (до C++20*)
Поддержка сборщика мусора (до C++23)
 
 
Определен в заголовке <new>
std::new_handler set_new_handler( std::new_handler new_p ) throw();
(до C++11)
std::new_handler set_new_handler( std::new_handler new_p ) noexcept;
(начиная с C++11)

Делает new_p новым глобальным обработчиком new и возвращает ранее установленный обработчик new.

Функция new-handler - это функция, вызываемая функциями выделения памяти при каждой неудачной попытке выделения памяти. Её предназначение - одно из трех:

1) сделать больше памяти доступной,
2) завершить программу (например, вызовом std::terminate),
3) выбросить исключение типа std::bad_alloc или производное от std::bad_alloc.

Реализация по умолчанию выбрасывает std::bad_alloc. Пользователь может установить свой собственный new-handler, который может предлагать поведение, отличное от поведения по умолчанию.

Если new-handler возвращается, функция выделения памяти повторяет ранее неудавшуюся попытку выделения и вызывает new-handler снова, если выделение снова не удается. Чтобы завершить цикл, new-handler может вызвать std::set_new_handler(nullptr): если после неудавшейся попытки выделения функция выделения обнаруживает, что std::get_new_handler возвращает нулевой указатель, она выбрасывает std::bad_alloc.

При запуске программы new-handler является нулевым указателем.

Эта функция является потокобезопасной. Каждый вызов std::set_new_handler synchronizes-with (см. std::memory_order) последующие std::set_new_handler и std::get_new_handler вызовы.

(начиная с C++11)

Параметры

new_p - указатель на функцию типа std::new_handler , или нулевой указатель

Возвращаемое значение

Ранее установленный обработчик new, или нулевой указатель, если обработчик не был установлен.

Пример

#include <iostream>
#include <new>
void handler()
{
    std::cout << "Memory allocation failed, terminating\n";
    std::set_new_handler(nullptr);
}
int main()
{
    std::set_new_handler(handler);
    try
    {
        while (true)
        {
            new int[1000'000'000ul]();
        }
    }
    catch (const std::bad_alloc& e)
    {
        std::cout << e.what() << '\n';
    }
}

Возможный вывод:

Memory allocation failed, terminating
std::bad_alloc

Смотрите также

функции выделения памяти
(функция)
получает текущий обработчик new
(функция)
тип указателя на функцию обработчика new
(typedef)
исключение, выбрасываемое при неудачном выделении памяти
(класс)