bad_alloc异常与在c + +中的向量

问题描述:

我不是很专业的用C++编程,所以我的问题可能会显得有点愚蠢,但我不明白我做错了什么。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

赶上只是你需要在'try'块做的一切,我也改变catch (bad_alloc& ba)catch (const bad_alloc& ba)。注意:我以前见过这个问题。我正在寻找重复。 – juanchopanza

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

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

这将向量放在外部范围,但允许分配是可捕获的。

如果您需要与rowotot*coltot元素的载体已经在它,那么你可以使用同样的事情,但无论哪种打电话std::vector::resize创建项目或创建一个临时的向量并将其分配给myvec

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

因为优选由const &

+1

或者,也许可以在try块中重新指定它,例如:'myvec = std :: vector (rowotot * coltot)',以便它已经包含项目。否则,你依赖的假设是,在try块之外不超过'rowotot * coltot'项目将被添加,并且不需要重新分配。 – tmlen

+0

@tmlen好点。我已经加入了答案。 – NathanOliver