0

传递给的参数class Rockvector<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的地址的副本,并将其保留在整个类成员函数中。但它似乎失去了对其二阶元素的跟踪。vectorRock

这有什么问题?我该如何纠正?我不想改变population变量的类型,否则后续代码也必须调整。

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

Rock::Rock ( const vector<vector<unsigned int> > & v, const map<unsigned int, AttType>& m, string f ) :
    // Default values for Rock parameters.                                                                                    
    population (&v),
    att_type ( m ),
    initial_pos (75000),
    population_size (500),
    sample_size (200),
    theta (0.2),
    nr_clusters (4),
    max_dif (500),
    label_as ("neighbors"),
    debug (false)
{
    resetBestPair();
    worst_pair.p1 = __INT_MAX__;
    worst_pair.p2 = __INT_MAX__;
    worst_pair.goodness = __DBL_MIN__;

    cfg_file = f;
    parseConfig ();
    cout << "constructor: population.size: " << population->size() << "    population[0].size: " << (*population)[0].size() <\
< endl;
}
4

1 回答 1

1

如果您知道vector<vector<unsigned int> >在 Rock 对象的生命周期内,传递给构造函数的对象仍然存在。我怀疑你传入的向量在 Rock 对象构建后的某个时候消失了。所以你的 Rock 对象有一个悬空指针,指向曾经是一个向量的东西,但现在完全不同了(那时内存可能已重新分配给其他东西)。现在程序正在将该位置的任何内容解释为向量,而您却在其中发现了垃圾。你也可能得到一个 SEGV,这一切都是不可预测的。第一个订单仍然报告相同数量的元素(500)的事实表明它的内存尚未重新分配,或者该重新分配数据的用户尚未覆盖向量的部分'

于 2012-12-06T23:42:30.860 回答