从bad_alloc获取更多细节?

时间:2013-08-17 14:47:50

标签: c++ exception memory vector stl

因为vector得到f(-1)的长无符号int调用抛出bad_alloc。我怀疑用2147483648打电话,实际上是18446744073709551615,因为它是x64系统。如何获取有关错误详细信息的信息?这可能是一般化的,我如何获得比e.what()更多的详细信息?

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;
}

2 个答案:

答案 0 :(得分:3)

就标准而言,除了what()提供的内容之外,没有其他信息(其内容,顺便说一下,留待实施)。

你可以做的是向vector提供你自己的分配器,它会抛出一个派生自bad_alloc的类,但是它也会指定你在捕获它时要检索的信息(例如内存量)必需的)。

答案 1 :(得分: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;
}

保留而不是初始化可能更适合。 请复制省略/返回值优化并记住。