我正在学习新的和删除,我不太了解下面代码中的nothrow
部分。
我知道std::nothrow
是告知编译器不要抛出异常,但还有其他理由写std::nothrow
吗?
我不完全理解的代码是:
// Is there another reason to write:
T *p = new(nothrow) T;
// instead of this:
T *p = new T;
我如何在两种情况下处理错误?
答案 0 :(得分:7)
关键字new将分配空间,创建对象并在分配的空间中返回指向该新对象的指针。
没有T *p = new T;
的 nothrow
最好与例外一起用于错误报告,因为如果new
失败,它会抛出{{1}或者在分配内存失败时从std::bad_alloc
(自C ++ 11 )派生的另一个异常。
示例:
std::bad_alloc
如果您没有使用异常进行错误报告,则应使用T *p;
try {
p = new T;
}
catch(const std::bad_alloc &e) {
std::cout << "Error: " << e.what() << '\n';
}
选项。
否则,当new或者失败时,它将抛出异常。使用nothrow
选项,它将返回一个空指针,然后我们可以像这样测试空指针:
nothrow
答案 1 :(得分:2)
阅读nothrow的标准,声称:
std :: nothrow是std :: nothrow_t类型的常量,用于消除抛出和非抛出分配函数的重载。
所以是的,基本上,这是一个标志,编译器知道要调用哪个分配函数,这是它唯一的标准化函数。