Domanda

Sono nuovo nella programmazione C ++ e apprezzerei molto le risposte che non presuppongono molte conoscenze precedenti.

Grazie ai suggerimenti qui, ho creato una mappa non ordinata:

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

I dati in questa mappa sono puntatori a istanze della classe Strain. Non appena vengono create queste istanze, creo loro dei puntatori e quindi aggiungo questi puntatori alla mia tabella hash (hmap strainTable) e ad un altro vettore (vettore & Lt; Strain * & Gt; liveStrains), ad es. ,

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;

Le istanze della classe Strain non vengono mai eliminate, né i puntatori ad esse rimossi da strainTable. I puntatori si spostano di tanto in tanto tra il vettore & Lt; Varietà * & Gt; liveStrains e vector < Varietà * & Gt; deadStrains, ma una volta su StrainTable, rimangono su StrainTable.

Questo è kosher? Finché le istanze sottostanti non verranno mai distrutte, i puntatori aggiunti rimarranno intatti?

È anche corretto che dovrei sempre essere in grado di ottenere gli attributi del membro dai puntatori in strainTable usando, ad esempio, per la prima voce,

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

Sto scoprendo che dopo un po ', i puntatori nella mia tabella di sforzo indicano la spazzatura.

È stato utile?

Soluzione

Un puntatore a qualsiasi oggetto allocato con new rimarrà valido fino a quando non si chiama delete sull'oggetto. Puoi copiare il puntatore quanto vuoi e sarà valido fino a quando l'oggetto sottostante non è stato eliminato.

In secondo luogo, sì, hai ragione nel poter accedere agli attributi degli oggetti dai puntatori memorizzati tramite iteratori di container. Ma controlla sempre per assicurarti che il valore di ritorno di hmap :: find () non sia uguale a hmap :: end ().

Quindi quello che descrivi va bene. Ora, sul motivo per cui i puntatori nella tabella strain stanno finendo per indicare la spazzatura, non potrei dire senza ulteriori dettagli. Sei sicuro di non eliminare alcun oggetto da nessuna parte? Sei sicuro che quando copi i puntatori da un vettore all'altro, lo stai facendo correttamente?

Altri suggerimenti

se non li hai mai delete, i puntatori sono ancora ok. D'altra parte, potresti voler mantenere le cose un po 'più ordinate e usare contenitori standard per l'intero shebang.

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top