2013-08-17 41 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。 –