常量
<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!


另见