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 вызывается функциями выделения памяти при неудачной попытке выделения памяти. Она предназначена для одного из трёх действий:
std::terminate),По умолчанию генерируется исключение std::bad_alloc. Пользователь может установить собственный обработчик new, который может вести себя по-другому.
Если обработчик new возвращает управление, функция выделения памяти повторяет предыдущую неудачную попытку выделения и вызывает обработчик new снова, если выделение памяти снова терпит неудачу. Чтобы завершить цикл, обработчик new может вызвать std::set_new_handler(nullptr). Если после неудачной попытки выделения памяти функция выделения обнаружит, что std::get_new_handler возвращает значение нулевого указателя, она сгенерирует исключение std::bad_alloc.
При запуске программы обработчик new равен нулевому указателю.
| Данная функция потокобезопасна. Каждый вызов | (с 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
См. также
| функции выделения памяти (функция) |
|
|
(C++11) | получает текущий обработчик new (функция) |
тип указателя на функцию обработчика new (typedef) |
|
| исключение, генерируемое при неудачном выделении памяти (класс) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/new/set_new_handler