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