基本的な質問:unordered_mapのオブジェクトへのポインター(C ++)
-
22-07-2019 - |
質問
私はC ++プログラミングに慣れていないので、事前の知識をあまり前提としない回答を大いに歓迎します。
ここでの提案のおかげで、順不同のマップを作成しました:
typedef std::tr1::unordered_map<std::string, Strain*> hmap;
このマップのデータは、クラスStrainのインスタンスへのポインターです。これらのインスタンスが作成されたらすぐに、それらへのポインターを作成し、次にこれらのポインターをハッシュテーブル(hmap strainTable)および別のベクター(vector <!> lt; Strain * <!> gt; 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のインスタンスは削除されず、それらへのポインターもstrainTableから削除されません。ポインターは時々vector <!> lt;の間を移動します。系統* <!> gt; liveStrainsとvector <!> lt;系統* <!> gt; deadStrains、しかしstrainTableに配置されると、strainTableに残ります。
これはコーシャですか?基礎となるインスタンスが決して破壊されない限り、それらに追加されたポインターはそのまま残りますか?
たとえば、最初のエントリに使用することで、strainTableのポインターから常にメンバー属性を取得できるはずであることも正しいですか?
hmap::const_iterator itr1 = strainTable.begin();
int id = (itr1->second)->getStrainID();
しばらくして、strainTableのポインタがゴミを指していることがわかりました。
解決
new
で割り当てられたオブジェクトへのポインタは、オブジェクトでdelete
を呼び出すまで有効です。ポインタは好きなだけコピーでき、基礎となるオブジェクトが削除されていない限り有効です。
第二に、はい、あなたはコンテナイテレータを介して保存されたポインタからオブジェクト属性にアクセスできることは正しいです。ただし、hmap :: find()の戻り値がhmap :: end()と等しくないことを常に確認してください。
だからあなたが説明するのは問題ありません。今、strainTableのポインターがゴミを指すようになっている理由については、詳細なしには言えません。どこのオブジェクトも削除していないのですか?あるベクターから別のベクターにポインターをコピーするとき、あなたはそれを正しくやっていると確信していますか?
他のヒント
それらを決して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);