我知道这样一个new(std::no_throw)
将设置指针NULL
,如果它失败了。 我也知道,一个正常new
将抛出一个异常std::bad_alloc
如果它失败了。如果它引发std :: bad_alloc,是否将新的指针设置为NULL?
将正常new
指针也设置为NULL
如果它抛出?或者我应该将它设置为catch()
块中的NULL
?
我知道这样一个new(std::no_throw)
将设置指针NULL
,如果它失败了。 我也知道,一个正常new
将抛出一个异常std::bad_alloc
如果它失败了。如果它引发std :: bad_alloc,是否将新的指针设置为NULL?
将正常new
指针也设置为NULL
如果它抛出?或者我应该将它设置为catch()
块中的NULL
?
C++中的坏new
将抛出一个异常(除非你使用std ::抛出异常),指针不会被分配,这样它会不管它是被做了new
调用之前。
但是,您可能会对this article感兴趣,其中谈到强制new
如您在问题中提到的那样在失败时返回null。
当一个异常被抛出,叠层被展开(运行本地对象的析构函数),直到停止catch
除外。没有任何东西会自动将指针设置为NULL
,并且其中一个析构函数可以这么做 - 这可能是一个人为的例子。
通常情况下,没有必要将指针设置为NULL
。事实上,你通常不能。看看下面的代码:
try {
std::string s("hello, world");
} catch (std::bad_alloc) {
// ???
}
这有可能是这12个字节的分配失败。异常将从std::string
的构造函数返回。在这一点上,对象s
已不存在,也没有指针s._SomeInternalName
内s
。如果您尝试在catch块中使用s
,编译器会报告错误。如果指针不存在了,你显然不能将它设置为0.