【问题标题】:vector of vectors, bad alloc向量的向量,错误的分配
【发布时间】:2009-08-20 08:22:07
【问题描述】:

我有一个名为 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..?)?

谢谢 (对不起这个愚蠢的问题,我是个穷学生:)

编辑:我发现了错误(只是一个超出范围的赋值)。如果您对这种数据结构有一般性建议,我还在这里...

【问题讨论】:

  • 你使用调试器吗?如果是这样,您可以在抛出异常的地方停下来看看那里发生了什么。

标签: c++ stdvector


【解决方案1】:

当您说“一段时间后”时,这是什么意思? std::bad_alloc 表示您的内存不足。你有一个吞噬内存的循环吗?

【讨论】:

    【解决方案2】:

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

    Buckets = matrix;
    

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

    【讨论】:

    • 注意不要使用 std::auto_ptr ,因为它的所有权转移语义不能保存在标准容器中使用
    【解决方案3】:

    如果你只想使用一个已知大小的二维矩阵,你可以使用一个简单的数组:

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

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

    有关简短示例,请参阅 here 或查看完整文档 there

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

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多