2011-01-06 54 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中的一個微軟嘗試過的領域(仍在嘗試?)與可移植代碼作鬥爭)。