函数
<new>

std::set_new_handler

new_handler set_new_handler (new_handler new_p) throw();
new_handler set_new_handler (new_handler new_p) noexcept;
设置新的处理函数
new_p 设置为new-handler函数

New-handler函数是默认的分配函数operator newoperator new[])在无法分配存储时调用的函数。

New-handler函数可以尝试使更多存储可用于分配存储的新尝试。如果(并且仅仅如果)该函数成功使更多存储可用,它可能会返回。否则,它应抛出 bad_alloc 异常(或其派生类),或终止程序(例如通过调用 abortexit)。

如果new-handler函数返回(即,它使更多存储可用),它可能会被反复调用,只要分配函数无法分配所需的存储,或者直到new-handler函数不返回或被替换。

在程序首次调用此函数之前,或者如果 new_p空指针,默认的分配函数在失败时将直接抛出 bad_alloc

参数

new_p
一个不接受参数且不返回任何值的函数(void)。
该函数可以使更多存储可用,或者抛出异常,或者终止程序。
如果这是一个空指针,则new-handler函数将被重置为无(并且相反地抛出 bad_alloc)。
new_handler 是一个函数指针类型,用于指向不接受参数且不返回任何值的函数。

返回值

如果此函数先前已被此函数设置,则为当前new-handler函数的值;如果是第一次调用 set_new_handler(或者它被之前的调用重置),则为空指针

new_handler 是一个不接受参数且不返回任何值的函数指针类型。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// new_handler example
#include <iostream>     // std::cout
#include <cstdlib>      // std::exit
#include <new>          // std::set_new_handler

void no_memory () {
  std::cout << "Failed to allocate memory!\n";
  std::exit (1);
}

int main () {
  std::set_new_handler(no_memory);
  std::cout << "Attempting to allocate 1 GiB...";
  char* p = new char [1024*1024*1024];
  std::cout << "Ok\n";
  delete[] p;
  return 0;
}

可能的输出

Attempting to allocate 1 GiB... Ok


数据竞争

调用此函数不会引入数据争用,任何此类调用都将与后续对 set_new_handlerget_new_handler 的调用同步。

请注意,此要求仅适用于 set_new_handler 函数,但不一定适用于作为参数 (new_p) 传递的new-handler函数

异常安全

无抛出保证:此函数(set_new_handler)从不抛出异常。

请注意,如果 new_p 是一个未实现适当功能(如上所述)的函数,或者 new_p 是一个无效指针,则会导致未定义行为

另见