如果抛出std :: bad_alloc,new会将指针设置为NULL吗?

时间:2011-01-30 20:08:45

标签: c++ null new-operator allocation bad-alloc

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

正常new是否也会将指针设置为NULL,如果它抛出的话?或者我应该在NULL区块中将其设置为catch()吗?

2 个答案:

答案 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.