2011-01-06 49 views
9

在我的一个学校项目中,我被要求创建一个不使用STL的程序。
在我使用了很多的C++中的错误分配例外

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

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

谢谢。
我在Windows 7

回答

10

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

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

它引发了bad_alloc异常。

也有一个nothrow版本新,您可以使用:

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

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

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

3
  1. 使用eclipseCDT(C++)使用MinGW是那里当分配失败时,通过新抛出的异常autamtic?
  2. 如果是的话我怎么能如果我不使用STL(#包括“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测试 enugh

0?

这是不需要的,除非你重载new操作!

0

标准新抛出的失败bad_alloc异常,那么您的空检查心不是必要的。

1
  1. 是:性病:: bad_alloc的

  2. 在我看来,这不是STL任何更多的运营商新的组成部分。 (你可以赶上......但你会失去与其他例外的歧视的可能性)。

  3. 这是不需要的,新会抛出一个异常,而不是返回NULL。

1

标准C++抛出一个异常,如果请求的内存无法分配。如果希望NULL,而不是例外,那么语法是

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

这句法结构“放置新的”分配,使分配器函数接收参数的情况。

大部分时间我看到new之后检查NULL是在Visual C++代码中,::operator new的默认行为是返回NULL而不是引发像标准要求的异常(这是IMO中的一个微软尝试过的领域(仍在尝试?)与可移植代码作斗争)。