2

我知道如果失败,new(std::no_throw)将设置指针。NULL我也知道如果失败,正常new会抛出异常。std::bad_alloc

如果抛出,法线new也会设置指针吗?NULL还是我应该将其设置NULLcatch()块中?

4

2 回答 2

6

在 C++ 中,一个 badnew会抛出一个异常(除非你使用 std::nothrow)并且指针不会被分配,所以它将是new调用之前的任何内容。

但是,您可能对本文感兴趣,该文章讨论了new您在问题中提到的在失败时强制返回 null 的内容。

于 2011-01-30T20:12:55.773 回答
0

当抛出异常时,堆栈被展开(运行本地对象的析构函数)直到catch停止异常。没有任何东西可以自动将指针设置为NULL,并且很可能其中一个析构函数会这样做 - 这将是一个人为的例子。

通常,不需要将指针设置为NULL. 事实上,很多时候你做不到。采取以下代码:

try { 
  std::string s("hello, world");
} catch (std::bad_alloc) {
 // ???
}

这 12 个字节的分配可能会失败。异常将从 的构造函数返回std::string。此时,对象s不再存在,s._SomeInternalName内部的指针也不存在ss因此,如果您尝试在 catch 块中使用,编译器将因此报告错误。如果指针不再存在,你显然不能将它设置为 0。

于 2011-01-31T14:29:45.423 回答