Namespaces
Variants

std:: set_new_handler

From cppreference.net
< cpp ‎ | memory ‎ | new
Utilities library
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until 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-handler и возвращает ранее установленный обработчик new-handler.

Функция 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 синхронизируется-с (см. 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)
исключение, выбрасываемое при неудачном выделении памяти
(класс)