2013-08-17 38 views
-1

自向量變長無符號整數調用f(-1)拋出bad_alloc。我懷疑有一個電話是2147483648,實際上是18446744073709551615,因爲它是x64系統。我怎樣才能獲得有關錯誤細節的信息?這可能是一般化的,我怎麼能得到比e.what()更多的細節?從bad_alloc中獲取更多詳細信息?

void f(int i){ 
    vector<int> v(i); 
    printf("vector size: %d", v.size()); 
} 

int main(int argc, char** argv) { 
    //f(1); // vector size: 1 
    try{ 
    f(-1); // terminate called after throwing an instance of 'std::bad_alloc' 
      //what(): std::bad_alloc 
    }catch(std::bad_alloc& e){ 
     printf("tried to allocate: %d bytes in vector constructor", e.?); 
    } 
    return 0; 
} 
+0

你想看什麼樣的附加信息? –

+0

與你的問題無關,你正在調用的vector構造函數需要'size_t'參數,而你正在傳遞'int'。提高警告級別,編譯器會警告你這些事情。 – IInspectable

+0

是的,這是真的,我知道,這只是一個簡短的測試,重要的是當我傳遞-1時會得到什麼 – 4pie0

回答

3

至於標準而言,還有比什麼是what()(其內容,順便說一句,留給執行)提供的其他任何額外的信息。

你可能要做的是提供vector你自己的分配器,拋出一個派生自bad_alloc的類,但是它也指定了你在捕獲時要檢索的信息(例如需要的內存量)。

+0

如果標準不關心,:p,任何想法如何可以檢索什麼是-1在矢量構造器中變成了什麼? – 4pie0

+1

如果重點只是瞭解'-1'變成了什麼,你可以'std :: cerr << std :: vector :: size_type(-1);' –

+0

我做了,得到了:18446744073709551615 – 4pie0

1
#include <vector> 
#include <iostream> 

template <typename T> 
std::vector<T> make_vector(typename std::vector<T>::size_type size, const T init = T()) { 
    try { 
     return std::vector<T>(size, init); 
    } 
    catch (const std::bad_alloc) { 
     std::cerr << "Failed to allocate: " << size << std::endl; 
     throw; 
    } 
} 

int main() 
{ 
    make_vector<int>(std::size_t(-1)); 
    return 0; 
} 

預留而不是初始化可能更適合。 請有複製elision /返回值優化和記住。

+0

不是std :: cerr << std :: vector :: size_type(-1)的擴展版本; ?不過這也回答了我的問題,謝謝 – 4pie0

+0

我不明白你的問題。隨意更換cerr並用任何你想要的東西扔出線,也許會拋出custom_bad_alloc。 –