使用c ++中的向量的bad_alloc异常

时间:2016-01-22 15:44:45

标签: c++ vector bad-alloc

我在使用c ++编程方面不是很专业,所以我的问题可能看起来有点愚蠢,但我无法理解我做错了什么。

我想用指令

分配一个向量
vector <short int> myvec(rowotot * coltot)

以表示矩阵。

在继续之前,我想验证我是否有足够的空间来分配我的矢量。 如果我使用

try { 
    vector <short int> myvec(rowtot * coltot);
}
catch (bad_alloc& ba) {
    cert << "ERROR: ";
    cerr << ba.what() << endl;
}

然后我尝试修改向量的元素,我不能因为

  

myvec未在此范围内声明

如何在向量中保存任何值之前检查内存? 我希望我的问题很明确。

1 个答案:

答案 0 :(得分:7)

一个简单的解决方案是将向量声明到try块之外,然后使用std::vector::reserve在try-catch块中分配空间。

std::vector<short int> myvec;
try
{
    myvec.reserve(rowotot*coltot);
}
catch (const bad_alloc& ba) 
{
    cerr <<"ERROR: ";
    cerr << ba.what() << endl;
}

这会将向量放在外部作用域中,但允许分配是可捕获的。

如果您需要包含已包含rowotot*coltot元素的向量,那么您可以使用相同的内容,但可以调用std::vector::resize来创建项目或创建临时向量并将其分配给{{ 1}}。

myvec

我还将std::vector<short int> myvec; try { myvec.resize(rowotot*coltot); // or myvec = std::vector<short int>(rowotot*coltot); } catch (const bad_alloc& ba) { cerr <<"ERROR: "; cerr << ba.what() << endl; } 更改为catch (bad_alloc& ba),因为首选catch (const bad_alloc& ba)