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 に答える