new(std :: nothrow)而不是new和错误处理

时间:2016-02-27 00:24:30

标签: c++ new-operator

我正在学习新的和删除,我不太了解下面代码中的nothrow部分。

我知道std::nothrow是告知编译器不要抛出异常,但还有其他理由写std::nothrow吗?

我不完全理解的代码是:

// Is there another reason to write: 
T *p = new(nothrow) T;
// instead of this:
T *p = new T;

我如何在两种情况下处理错误?

2 个答案:

答案 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类型的常量,用于消除抛出和非抛出分配函数的重载。

所以是的,基本上,这是一个标志,编译器知道要调用哪个分配函数,这是它唯一的标准化函数。