2017-04-11 66 views
1

我想抓住錯誤的分配錯誤。當輸入長度將按照10000000000000000000000或某物的順序時,則應該出現錯誤的分配錯誤。我不知道爲什麼它沒有被抓到。 任何幫助將不勝感激!沒有輸出,而嘗試趕上在c + +

# include <vector> 
# include <iostream> 


using namespace std; 

void length(int m) 
{ 
    vector<int> x; 

    try 
    { 
    x.resize(m); 
    } 
    catch(std::bad_alloc&) 
    { 
     cout << "caught bad alloc exception" << std::endl; 
    } 
} 

int main() 

{ 

    int l; 
    cout << "Length" ; 
    cin >> l ; 
    length(l); 

    return 0; 
} 

更新:

當我硬編碼的輸入值,則拋出異常。我不知道爲什麼它以這種方式工作。

# include <vector> 
# include <iostream> 


using namespace std; 



void length(int m) 
{ 
    vector<int> x; 

    try 
    { 
    x.resize(m); 
    } 
    catch(std::bad_alloc&) 
    { 
     cout << "caught bad alloc exception" << std::endl; 
    } 
} 

int main() 

{ 

    int m= 100000000000000000000; 
    length(m); 

    return 0; 
} 
+0

我看到捕獲的異常[點擊這裏運行(HTTP:// CPP。sh/9fwg)與一個大的輸入(例如10000000000) – CoryKramer

+0

它可以是一個編譯器問題?因爲我沒有得到這個例外。 – jennifer

+1

你如何輸入'2^500'? – m0nhawk

回答

0

整型int的最大長度是2.147.483.647。你確定你確實使用了更高的數字來測試它嗎?

+1

「int」的最大尺寸未定義。我們所知道的肯定是它必須至少是32767. – NathanOliver

+0

@NathanOliver:首選「實現定義」爲「未定義」? – Bathsheba

+0

@Bathsheba是的。我在那裏錯過了。它是實現定義的。 – NathanOliver

1

你應該寫

if (!(cin >> l)){ 
    // I could not read that into `l` 
} 

缺乏被抓可能會下降到

  1. 異常的你int價值比你認爲(也許有些不確定環繞小行爲),並且自分配成功以來不引發異常。

  2. 該分配是懶惰從意義上說,內存不分配,直到你真正使用它。

  3. 如果std::bad_alloc作爲被拋出匿名臨時那麼它將不會被捕獲到您的捕獲網站。 (除非你頑皮的編譯器允許非const引用綁定到匿名臨時對象,有些作爲擴展名)。改爲寫catch (const std::bad_alloc&),而被抓到那裏。

+0

雖然在捕獲應用程序方面正確,但如果未捕獲到異常,應該以未捕獲的異常終止。這不會發生,因此不會拋出異常。 – NathanOliver

+0

它沒有工作。 – jennifer

+0

那麼這*證明* std :: bad_alloc'不是被拋出。 – Bathsheba

0
  1. 你傳遞這有限制整型變量。 -32768 類型的短變量最大值:類型的短變量 最小值32767
  2. ,你會從你的代碼得到的錯誤是的std :: length_error
  3. 爲了提高不良分配動態錯誤,你可以嘗試malloc()不正確的大小或嘗試下面的代碼。

#include <iostream> 
#include <new> 

int main() 
{ 
    try { 
     while (true) { 
      new int[100000000ul]; 
     } 
    } catch (const std::bad_alloc& e) { 
     std::cout << "Allocation failed: " << e.what() << '\n'; 
    } 
} 
</i> 
+0

實際上它是-32767,用於'short' *和* an'int'。不要忘記1的補碼和有符號的幅度。 – Bathsheba

0

沒有異常被拋出,因爲這使得它通過你的函數void length(int m)int在其最大值是遠小於vector::max_size()封頂。試想一下:

void length(int m) 
{ 
    cout << "m is: " << m << " which has a max value: " << numeric_limits<int>::max() << endl; 
    // ... 
} 

與輸出: Length10000000000000000000000 m is: 2147483647 and has a max value: 2147483647