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