-1

因为 vector 得到 long unsigned int 调用f(-1)throws 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;
}
4

2 回答 2

3

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

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

于 2013-08-17T14:50:55.663 回答
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;
}

保留而不是初始化可能更适合。请注意复制省略/返回值优化和移动。

于 2013-08-17T16:14:34.890 回答