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::set_new_handler std::memory_order 调用 同步于 (参见 std::get_new_handler )。

(since C++11)

目录

参数

new_p - 指向类型为 std::new_handler 的函数的指针,或空指针

返回值

先前安装的新处理函数,若无安装则返回空指针值。

示例

#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 处理器的函数指针类型
(类型定义)
内存分配失败时抛出的异常
(类)