函式
<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 是一個無效指標,則會導致未定義行為

另見