Frage

Ich bin neu in C ++ Programmierung und Antworten sehr freuen würde, die nicht davon ausgehen, viel Vorwissen.

Dank Vorschläge hier, ich habe eine ungeordnete Karte erstellt:

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

Die Daten in dieser Karte sind Zeiger auf Instanzen der Klasse Stamm. Sobald diese Instanzen geschaffen, ich erstellen Zeiger auf sie, und ich dann diese Zeiger auf meine Hash-Tabelle (HMAP strainTable) und zu einem anderen Vektor (Vektor liveStrains) hinzufügen, z. B.

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;

Instanzen der Klasse Stamm werden nie gelöscht, noch sind Zeiger auf sie aus strainTable entfernt. Pointers kann gelegentlich zwischen Vektor bewegen liveStrains und Vektor deadStrains, aber einmal auf strainTable, sie bleiben auf strainTable.

Ist das koscher? Solange die zu Grunde liegenden Instanzen nie zerstört werden, werden ihnen die Zeiger hinzugefügt intakt bleiben?

Ist es auch richtig, dass ich immer in der Lage sein sollte, Mitglied Attribute indem man zum Beispiel in strainTable von den Zeigern zu bekommen, für den ersten Eintrag,

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

Ich finde, dass nach einer gewissen Zeit, Zeiger in meinem strainTable Punkt zu Müll.

War es hilfreich?

Lösung

Ein Zeiger auf ein beliebiges Objekt mit new zugeordnet bleibt gültig, bis Sie delete auf das Objekt aufrufen. Sie können so viel um den Zeiger kopieren, wie Sie wollen, und es wird so lange gültig sein, wie das zugrunde liegende Objekt nicht gelöscht wurde.

Zweitens, ja, sind Sie richtig, dass Sie Objektattribute aus den gespeicherten Zeiger über Container Iteratoren zugreifen können. Aber immer überprüfen, um sicherzustellen, dass der Rückgabewert von HMAP :: find () ist nicht gleich HMAP :: end ().

Also, was Sie beschreiben, ist in Ordnung. Nun, warum die Zeiger in Ihrem strainTable enden bis zu Müll zeigen, konnte ich nicht ohne weitere Details sagen. Sind Sie sicher, dass Sie keine Gegenstände überall zu löschen? Sind Sie sicher, dass, wenn Sie Zeiger von einem Vektor zum anderen kopieren, können Sie es richtig tun?

Andere Tipps

, wenn Sie sie nie delete, dann sind die Zeiger immer noch in Ordnung. Auf der anderen Seite, können Sie die Dinge ein wenig aufgeräumter und verwenden Standard-Container für den ganzen Kram zu halten.

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top