我知道如果失败,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。