4

私は C++ プログラミングの初心者であり、事前の知識をあまり前提としない回答をいただければ幸いです。

ここでの提案のおかげで、順序付けられていないマップを作成しました。

typedef std::tr1::unordered_map<std::string, Strain*> hmap;

このマップのデータは、クラス Strain のインスタンスへのポインターです。これらのインスタンスが作成されるとすぐに、それらへのポインターを作成し、これらのポインターをハッシュ テーブル (hmap StrainTable) と別のベクトル (vector< Strain *> liveStrains) に追加します。たとえば、次のようになります。

string MRCA;
for ( int b = 0; b < SEQ_LENGTH; b++ ) {
 int randBase = rgen.uniform(0,NUM_BASES); 
 MRCA.push_back( BASES[ randBase ] );
}
Strain * firstStrainPtr;
firstStrainPtr = new Strain( idCtr, MRCA, NUM_STEPS );
liveStrains.push_back( firstStrainPtr ); 
strainTable[ MRCA ]= firstStrainPtr;

クラス Strain のインスタンスは決して削除されません。また、それらへのポインタがひずみテーブルから削除されることもありません。vector< Strain * > liveStrains と vector< Strain * > deadStrains の間でポインターが時々移動しますが、一度ひずみテーブルに置かれると、それらはひずみテーブルにとどまります。

これはコーシャですか?基になるインスタンスが破棄されない限り、それらに追加されたポインターはそのまま残りますか?

たとえば、最初のエントリに、

 hmap::const_iterator itr1 = strainTable.begin();
 int id = (itr1->second)->getStrainID();

しばらくすると、strainTable のポインターがガベージを指していることがわかりました。

4

2 に答える 2

2

で割り当てられたオブジェクトへのポインターは、オブジェクトnewを呼び出すまで有効なままですdelete。ポインタは好きなだけコピーでき、基になるオブジェクトが削除されていない限り有効です。

第二に、はい、コンテナー イテレーターを介して格納されたポインターからオブジェクト属性にアクセスできることは正しいです。ただし、hmap::find() の戻り値が hmap::end() と等しくないことを常に確認してください。

だからあなたが説明するものは大丈夫です。さて、strainTable のポインターが最終的にゴミを指している理由については、詳細なしでは言えません。どこにもオブジェクトを削除していませんか? ポインターをあるベクターから別のベクターにコピーするとき、それを正しく行っていると確信していますか?

于 2009-10-31T00:51:04.067 に答える
1

それらを決してしない場合deleteでも、ポインターは問題ありません。一方で、物事を少し整理して、シバン全体に標準のコンテナーを使用したい場合もあります。

typedef std::tr1::unordered_map<std::string, Strain> hmap;
typedef std::tr1::unordered_map<std::string, hmap::iterator> weakhmap;

hmap strainTable;
weakhmap liveStrains;
Strain firstStrain( idCtr, MRCA, NUM_STEPS );
strainTable[MRCA] = firstStrain;
liveStrains[MRCA] = strainTable.find(MRCA);
于 2009-10-31T00:17:51.647 に答える