矢量矢量,bad_alloc

时间:2009-08-20 08:22:07

标签: c++ stdvector

我有一个名为Contact的类,我想构建一个指向这些对象的指针的数据结构,如127行和20列的矩阵。 我试图以这种方式使用std :: vector类

std::vector < std::vector<Contact* > > matrix (127, std::vector < Contact* > (20));

然后,在标题

中声明了以下内容
std::vector<std::vector<Contact* > > Buckets;

我将之前初始化和声明的矩阵分配给它(这一步因为基本上我不知道如何以更清晰和简短的方式进行):

Buckets = matrix;

但使用像

这样的push_back函数
Buckets[pot].push_back(cont_temp);

一段时间后产生错误(“在抛出'std :: bad_alloc'的实例后调用终止”)并且我不知道如何修复它。

还有其他更好的方法来实例化和初始化矩阵吗?你会建议其他解决方案,而不是使用矢量矢量(一个boost :: multiarray ..?)?

感谢 (抱歉这个愚蠢的问题,我是一个可怜的学生:)

编辑:我发现了错误(只是一个超出界限的分配)。如果您对此类数据结构有一般性建议,我仍然在这里...

3 个答案:

答案 0 :(得分:2)

当你说“过了一会儿”时,这是什么意思? std :: bad_alloc意味着你的内存不足。你有一个吞噬记忆的循环吗?

答案 1 :(得分:0)

矩阵中的联系人是否动态分配?如果是这样,当你说:

Buckets = matrix;

你最终得到两个指向同一个动态分配对象的指针,这只会导致线路故障。您应该使用智能指针的向量,例如Boost的共享指针。

答案 2 :(得分:0)

如果您只想使用已知尺寸的二维矩阵,您可以使用一个简单的数组:

(Contact*) matrix[127][20];

当然,如果可以在编译后确定或更改大小,则此方法不起作用。 在这种情况下,我建议您转向提升库,特别是multi_array。

有关简短示例,请参见here;有关完整文档,请参阅there

typedef boost::multi_array<Contact*, 2> ContactContainer;
ContactContainer matrix(boost::extents[127][20]);