1

当我编写如下代码时,它将返回“null”并且没有发生异常。

Char* pStr = new(std::nothrow)Char(10);

在 new 运算符上不使用“nothrow”参数怎么样?它是否也返回'null'?如果是这样,为什么建议使用“nothrow”参数?

Char* pStr = new Char(10);

谢谢你的时间。

4

3 回答 3

5

new如果失败,将抛出异常,除非您指定,在这种情况下,如果失败nothrow将返回。nullptr

至于为什么nothrow使用:在某些系统上,不支持异常(或严重支持)(在游戏机上尤其如此)。所以最好不要使用它们。这只是nothrow可以使用的一个例子。

于 2012-12-10T04:49:57.813 回答
2

不对运算符使用nothrow参数怎么new办?它也返回null吗?

C++ 标准(第 18.4.1.1 节)将 operator new 定义为:

void* operator new (std::size_t size) throw (std::bad_alloc);

因此,带有一个参数的 new 的标准行为是std::bad_alloc在失败的情况下抛出 a 。该标准还定义了一个nothrow采用两个参数的新版本:

void* operator new(std::size_t size, const std::nothrow_t&) throw();

此版本在失败的情况下返回 a NULL,但请注意,要使用此版本,您明确需要将附加参数传递给 new 运算符。


什么时候应该使用nothrow版本?

理想情况下,您应该始终使用标准版本的 new ,它会抛出bad_alloc. 您应该始终坚持该建议。但是,在某些情况下,您可能会被迫使用该nothrow版本。其中一些情况是:

  • 您正在使用不支持异常的旧 C++ 编译器(在语言标准化之前发布)。
  • 明确禁用异常的目标平台(例如:嵌入式系统)或不保证正常工作。
  • 1990 年后的标准行为new是 return NULL,如果您正在使用大量依赖此行为的遗留代码。
于 2012-12-10T04:58:48.837 回答
-1

new无法分配内存时,它会抛出一个异常bad_alloc,如果不处理此异常,这将使您的程序以不寻常的方式崩溃。如果我们想避免这种情况,我们可以使用nothrowwhich 是重载函数的参数,new也可以 catch例外。nothrownull在内存不足时返回,程序员可以决定此时要做什么。

于 2012-12-10T05:13:13.223 回答