Question

Je suis nouveau dans la programmation C ++ et j'apprécierais grandement les réponses qui ne supposent pas beaucoup de connaissances préalables.

Grâce aux suggestions ici, j'ai créé une carte non ordonnée:

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

Les données de cette carte sont des pointeurs sur des instances de la classe Strain. Dès que ces instances sont créées, je crée des pointeurs sur celles-ci, que je rajoute ensuite à ma table de hachage (hmap contrainteTable) et à un autre vecteur (vecteur & Lt; Strain * & Gt; liveStrains), par exemple ,

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;

Les instances de la classe Strain ne sont jamais supprimées, pas plus que les pointeurs qui les pointent ne sont supprimées de contrainteTable. Les pointeurs se déplacent parfois entre les vecteurs & Lt; Strain * & Gt; liveStrains et vector < Strain * & Gt; deadStrains, mais une fois sur fatTable, ils restent sur stressTable.

Est-ce casher? Tant que les instances sous-jacentes ne sont jamais détruites, les pointeurs qui leur ont été ajoutés restent-ils intacts?

Est-il également exact que je devrais toujours pouvoir obtenir les attributs de membre des pointeurs de la table contrainte en utilisant, par exemple, pour la première entrée,

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

Je constate qu'après un certain temps, les pointeurs de ma table de contraintes pointent vers des ordures.

Était-ce utile?

La solution

Un pointeur sur un objet affecté de new reste valide jusqu'à ce que vous appeliez delete sur l'objet. Vous pouvez copier le pointeur autant de fois que vous le souhaitez et il sera valide tant que l'objet sous-jacent n'a pas été supprimé.

Deuxièmement, vous avez raison de dire que vous pouvez accéder aux attributs d’objet à partir des pointeurs stockés via des itérateurs de conteneur. Mais vérifiez toujours que la valeur renvoyée par hmap :: find () n’est pas égale à hmap :: end ().

Donc, ce que vous décrivez va bien. Maintenant, pour ce qui est de savoir pourquoi les pointeurs de votre table de contraintes finissent par pointer vers des ordures, je ne saurais le dire sans plus de détails. Êtes-vous sûr de ne supprimer aucun objet quelque part? Etes-vous sûr que lorsque vous copiez des pointeurs d'un vecteur à l'autre, vous le faites correctement?

Autres conseils

si vous ne les supprimez jamais , les pointeurs restent corrects. D'autre part, vous voudrez peut-être garder les choses un peu plus propres et utiliser des conteneurs standard pour tout le 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top