std:: set_new_handler
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Functions | ||||
|
(C++11)
|
||||
|
set_new_handler
|
||||
| Classes | ||||
|
(C++11)
|
||||
|
(C++17)
|
||||
| Types | ||||
| Objects | ||||
|
(C++20)
|
||||
| Object access | ||||
|
(C++17)
|
|
Определено в заголовке
<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 — это функция, вызываемая функциями выделения памяти при неудачной попытке выделения памяти. Её предназначение заключается в одном из трёх действий:
Реализация по умолчанию генерирует исключение 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 является нулевым указателем.
|
Эта функция является потокобезопасной. Каждый вызов
|
(начиная с 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) |
|
|
исключение, выбрасываемое при неудачном выделении памяти
(класс) |