当我编写如下代码时,它将返回“null”并且没有发生异常。
Char* pStr = new(std::nothrow)Char(10);
在 new 运算符上不使用“nothrow”参数怎么样?它是否也返回'null'?如果是这样,为什么建议使用“nothrow”参数?
Char* pStr = new Char(10);
谢谢你的时间。
当我编写如下代码时,它将返回“null”并且没有发生异常。
Char* pStr = new(std::nothrow)Char(10);
在 new 运算符上不使用“nothrow”参数怎么样?它是否也返回'null'?如果是这样,为什么建议使用“nothrow”参数?
Char* pStr = new Char(10);
谢谢你的时间。
new
如果失败,将抛出异常,除非您指定,在这种情况下,如果失败nothrow
将返回。nullptr
至于为什么nothrow
使用:在某些系统上,不支持异常(或严重支持)(在游戏机上尤其如此)。所以最好不要使用它们。这只是nothrow
可以使用的一个例子。
不对运算符使用
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
版本。其中一些情况是:
new
是 return NULL
,如果您正在使用大量依赖此行为的遗留代码。当new
无法分配内存时,它会抛出一个异常bad_alloc
,如果不处理此异常,这将使您的程序以不寻常的方式崩溃。如果我们想避免这种情况,我们可以使用nothrow
which 是重载函数的参数,new
也可以 catch例外。nothrow
将null
在内存不足时返回,程序员可以决定此时要做什么。