我知道如果失败,new(std::no_throw)
会设置指向NULL
的指针。
我也知道,如果失败,普通new
会抛出std::bad_alloc
异常。
正常new
是否也会将指针设置为NULL
,如果它抛出的话?或者我应该在NULL
区块中将其设置为catch()
吗?
答案 0 :(得分:6)
在C ++中,一个错误的new
将抛出一个异常(除非你使用std :: nothrow)并且指针不会被分配,因此它将是new
调用之前的所有内容
但是,您可能会对this article感兴趣,因为您在问题中提到强制new
在失败时返回null。
答案 1 :(得分:0)
抛出异常时,堆栈被展开(运行本地对象的析构函数),直到catch
停止异常。没有任何东西可以自动将指针设置为NULL
,而且其中一个析构函数也是如此 - 这将是一个人为的例子。
通常,不需要将指针设置为NULL
。事实上,往往你不能。请使用以下代码:
try {
std::string s("hello, world");
} catch (std::bad_alloc) {
// ???
}
这12个字节的分配可能会失败。异常将从std::string
的构造函数返回。此时,对象s
不再存在,指针s._SomeInternalName
也不在s
内。如果您尝试在catch块中使用s
,编译器将因此报告错误。如果指针不再存在,您显然无法将其设置为0.