C ++中的错误分配异常

时间:2011-01-06 12:45:41

标签: c++ exception mingw new-operator allocation

在我的学校项目中,我被要求创建一个不使用STL的程序 在程序中我使用了很多

Pointer* = new Something;
if (Pointer == NULL) throw AllocationError();

我的问题是关于分配错误:
1.当分配失败时,是否有新的自动异常? 2.如果是的话,如果我不使用STL(#include "exception.h),我怎么能抓住它 3.正在使用NULL测试吗?

谢谢你 我在Windows 7上使用eclipseCDT(C ++)和MinGW。

6 个答案:

答案 0 :(得分:12)

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

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

抛出bad_alloc例外。

您还可以使用nothrow版本的新版本:

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

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

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

答案 1 :(得分:3)

  
      
  1. 分配失败时是否有新的autamtic异常?
  2.   
  3. 如果是的话,如果我不使用STL(#include" exception.h),我怎么能抓住它?
  4.   

是。看这个例子。它还演示了如何捕获异常!

  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测试   enugh?

除非您重载new运算符!

,否则不需要

答案 2 :(得分:1)

  1. 是:std :: bad_alloc

  2. 在我看来,这不再是STL的一部分了。 (你可以抓住......但是你可能会失去其他例外的可能性。)

  3. 不需要,new会抛出异常而不返回NULL。

答案 3 :(得分:1)

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

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

此语法只是“placement new”分配的一种情况,它允许分配器函数接收参数。

我在{C}代码new之后看到检查NULL的大部分时间都是::operator new的默认行为是返回NULL而不是像标准要求那样引发异常(这是IMO尝试(仍在尝试?)与可移植代码作斗争的众多领域之一。)

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这取决于 旧的c ++编译器提供set_new_handler来捕获分配失败。 您还可以捕获bad_alloc异常。

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

如果你想控制它,你也可以覆盖operator new / operator delete