Spec-Zone.ru › C++

std::set_new_handler

Определён в заголовочном файле <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 вызывается функциями выделения памяти при каждой неудачной попытке выделения памяти. Она предназначена для одной из трёх целей:

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

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

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

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

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

(начиная с 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

См. также

operator newoperator new[]
функции выделения памяти
(функция)
get_new_handler
(C++11)
получает текущий обработчик new
(функция)
new_handler
тип указателя на функцию-обработчик new
(определение типа)
bad_alloc
исключение, выбрасываемое при неудачном выделении памяти
(класс)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/new/set_new_handler

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API