Пространства имён
Варианты
Действия

std::set_new_handler

Материал из cppreference.com
< cpp | memory | new
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
 
<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody>
Определено в заголовочном файле <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::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 << "Не удалось выделить память, завершение\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';
    }
}

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

Не удалось выделить память, завершение
std::bad_alloc

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

функции распределения памяти
(функция) [править]
получает текущий обработчик new
(функция) [править]
тип указателя на функцию обработчика new
(определение типа) [править]
исключение генерируемое при сбое выделения памяти
(класс) [править]
Morty Proxy This is a proxified and sanitized view of the page, visit original site.