常量
<new>

std::nothrow

extern const nothrow_t nothrow;
Nothrow 常量
此常量用作 operator newoperator new[] 的引數,以指示這些函式在失敗時不得丟擲異常,而是返回一個空指標

預設情況下,當 new 運算子用於嘗試分配記憶體而處理函式無法做到時,會丟擲 bad_alloc 異常。但是當 nothrow 用作 new 的引數時,它會返回一個空指標

此常量(nothrow)只是 nothrow_t 型別的一個值,其唯一目的是觸發接受該型別引數的函式 operator new(或 operator new[])的過載版本。

在 C++ 中,operator new 函式可以過載以接受多個引數:傳遞給 operator new 函式的第一個引數始終是要分配的儲存大小,但可以透過在new 表示式中用括號將其括起來來傳遞其他引數。例如

1
int * p = new (x) int;

是一個有效表示式,它在某個時候會呼叫

1
operator new (sizeof(int),x);

預設情況下,operator new 的一個版本被過載以接受 nothrow_t 型別(如 nothrow)的引數。該值本身不被使用,但該版本的 operator new 在失敗時應返回空指標而不是丟擲異常。

同樣適用於 new[] 運算子和函式 operator new[]

示例

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

int main () {
  std::cout << "Attempting to allocate 1 MiB... ";
  char* p = new (std::nothrow) char [1048576];

  if (!p) {             // null pointers are implicitly converted to false
    std::cout << "Failed!\n";
  }
  else {
    std::cout << "Succeeded!\n";
    delete[] p;
  }

  return 0;
}

可能的輸出

Attempting to allocate 1 MiB... Succeeded!


另見