:bad_alloc传递向量引用指向构造函数中的向量

时间:2012-12-06 23:24:51

标签: c++ pointers reference constructor

传递给class Rock的参数是vector<vector<unsigned int> >

population定义为:

const std::vector<std::vector<unsigned int> > * population;

在构造函数中:

Rock::Rock ( const vector<vector<unsigned int> > & v):
population (&v)
{
cout << "constructor: population.size: " << population->size() << "    population[0].size: " << (*population)[0].size() <\
    < endl;
}

打印出来:

constructor: population.size: 500    population[0].size: 4

然后,在构造函数之后调用的下一个成员函数中:

population.size(): 500   population[0].size() 18446744073709533580

我认为population将保留传递给vector的{​​{1}}地址的副本,并且它将在整个类成员函数中保留它。但它似乎无法追踪其二阶元素。

这有什么问题?我怎么能纠正这个?我不想改变Rock类型的变量,否则后续代码也必须调整。

编辑0:构造函数的完整代码:

population

1 个答案:

答案 0 :(得分:1)

如果您知道传递给构造函数的vector<vector<unsigned int> >在Rock对象的生命周期内仍然存在,那么您编码的内容“很好”(虽然很危险)。我怀疑你传入的矢量会在构建Rock对象后的某个时刻消失。所以你的Rock对象有一个悬挂指针指向USED TO a vector,但现在却完全不同了(内存可能会被重新分配给其他东西)。现在,程序正在将该位置的任何内容解释为向量,而不是它,并且您正在其中找到垃圾。你也可能得到一个SEGV,这一切都是不可预测的。第一个订单仍然报告相同数量的元素(500)的事实表明其内存尚未重新分配,或者该重新分配的数据的用户没有覆盖向量管理数据的部分,该数据告知其当前大小