C++中的坏分配异常

16
在我的学校项目中,要求我创建一个不使用STL的程序。 在该程序中,我使用了很多
Pointer* = new Something;
if (Pointer == NULL) throw AllocationError();

我的问题是关于内存分配错误的:

  1. new 在分配失败时会抛出一个自动异常吗?
  2. 如果有,那么如果我没有使用STL#include "exception.h"),我该如何捕获它呢?
  3. NULL 测试是否足够?

谢谢。
我在 Windows 7 上使用 MinGWeclipseCDT(C++)

6个回答

17

如果无法分配内存,新的操作符将自动抛出异常。

除非你的编译器以某种方式禁用它,否则new运算符永远不会返回空指针。

它会抛出一个bad_alloc异常。

同时,还有一个nothrow版本的new可以使用:

int *p = new(nothrow) int(3);

如果无法分配内存,此版本将返回空指针。但请注意,这并不保证100%的nothrow,因为对象的构造函数仍然可能抛出异常。

更多信息:http://msdn.microsoft.com/en-us/library/stxdwfae(VS.71).aspx


5
  1. 当分配失败时,new会自动抛出异常吗?
  2. 如果是的话,如果我不使用STL(#include "exception.h"),我该如何捕获它?

是的。请参考以下示例。它还演示了如何捕获异常!

  try
  {
    int* myarray= new int[10000];
  }
  catch (bad_alloc& ba)
  {
    cerr << "bad_alloc caught: " << ba.what() << endl;
  }

从这里开始:http://www.cplusplus.com/reference/std/new/bad_alloc/

3. 只使用 NULL 测试就足够了吗?

除非你重载了 new 操作符,否则不需要这样做!


2
  1. 是的:std::bad_alloc

  2. 在我看来,这不再是STL的一部分,就像operator new一样。(你可以捕获……但你将失去与其他异常区分的可能性。)

  3. 它是不必要的,new会抛出异常而不是返回NULL。


2

如果请求的内存无法分配,标准C++会抛出异常。如果您想要NULL而不是异常,则语法为

Whatever *p = new (std::nothrow) Whatever;

这个语法只是“放置new”分配的一个案例,它允许分配器函数接收参数。
我看到大多数在new之后检查NULL的情况都出现在Visual C++代码中,在那里::operator new的默认行为是返回NULL而不是像标准要求的那样引发异常(在我看来,这是微软试图(仍在尝试?)对抗可移植代码的众多领域之一)。

1

标准的 new 在失败时会抛出 bad_alloc 异常,因此您不需要进行空指针检查。


0

这要看情况

旧的C++编译器提供了set_new_handler来捕获分配失败。

您也可以捕获bad_alloc异常。

http://en.wikipedia.org/wiki/New_%28C%2B%2B%29

如果您想控制这个,您也可以重载operator new/operator delete对。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接