如果新操作员工作,应该总是检查吗?

时间:2011-03-04 18:25:59

标签: c++ new-operator

我对新运算符有两个问题:

  1. 新操作员无法分配内存吗?

  2. 如果确实有一个对象被创建,那么每次使用new后都应该进行一次测试吗?

5 个答案:

答案 0 :(得分:21)

operator new throws a std::bad_alloc exception on failure,除非您明确使用nothrow版本。因此,不要检查返回值:如果在构造函数调用后到达下一行,则可以安全地假设构造函数成功。

但是将代码的适当范围的分支包装在try-catch块中:通常不是直接围绕新的调用,而是在可以调用依赖于分配的所有内容的行的某个地方,而不是其他任何内容。

更新:但请参阅Jonathan Leffler在下面的评论中关于new的nothrow变体。

答案 1 :(得分:13)

  1. 是的,new无法分配内存,但默认情况下会在失败时抛出异常。
  2. 如果您使用new的无抛出变体,则只需检查结果。

答案 2 :(得分:4)

一般情况下,无需检查null。分配失败将抛出std :: bad_alloc异常,如果您愿意,可以处理。

标准表明:

“如果使用非抛出异常规范(15.4)声明的分配函数无法分配存储,则它应返回空指针。未能分配存储的任何其他分配函数应仅通过抛出异常来指示失败一个匹配std :: bad_alloc(18.6.2.1)类型的处理程序(15.3)的类型。“

YMMV取决于您的编译器实际符合标准的方式。我认为大多数现代c ++编译器应该不好意思做到不同。 :)

答案 3 :(得分:1)

我不认为你应该每次检查是否要创建新的Object,通常新的操作符在创建对象时不会失败,除非你有一些编码问题。

你唯一需要考虑的是拥有一个正常工作的构造函数,它可以正确地设置新对象。

答案 4 :(得分:1)

  1. 是。如果它在具有虚拟内存的现代操作系统上失败,通常是因为应用程序中的错误(例如,分配疯狂的内存量)或非常糟糕的碎片问题。

  2. 如果new失败,则会引发std::bad_alloc异常。由您的应用程序决定是否要捕获该异常并尝试其他方法。这在很大程度上取决于应用程序的类型。

  3. 但是,有些人使用非标准版本的new返回空指针而不是抛出异常。您将使用与旧式malloc相同的标准。这取决于分配的类型。通常,如果您无法完成分配,崩溃是适当的事情,因此不检查NULL是一个可接受的决定。