Pregunta

Soy nuevo en la programación de C ++ y agradecería enormemente las respuestas que no suponen mucho conocimiento previo.

Gracias a las sugerencias aquí, he creado un mapa desordenado:

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

Los datos en este mapa son punteros a instancias de la clase Strain. Tan pronto como se crean estas instancias, les creo punteros y luego los agrego a mi tabla hash (hmap strainTable) y a otro vector (vector & Lt; Strain * & Gt; liveStrains), p. Ej. ,

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;

Las instancias de la clase Strain nunca se eliminan, ni los punteros a ellas se eliminan de la tabla de tensión. Los punteros ocasionalmente se mueven entre el vector & Lt; Colar * & Gt; liveStrains y vector < Colar * & Gt; deadStrains, pero una vez en la tabla de tensión, permanecen en la tabla de tensión.

¿Es esto kosher? Mientras las instancias subyacentes nunca se destruyan, ¿los punteros que se les agreguen permanecerán intactos?

¿También es correcto que siempre pueda obtener atributos de miembro de los punteros en la tabla de cepas usando, por ejemplo, para la primera entrada,

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

Estoy descubriendo que después de un tiempo, los punteros en mi tabla de tensión apuntan a la basura.

¿Fue útil?

Solución

Un puntero a cualquier objeto asignado con new seguirá siendo válido hasta que llame a delete en el objeto. Puede copiar el puntero tanto como desee, y será válido siempre que el objeto subyacente no se haya eliminado.

En segundo lugar, sí, tiene razón en que puede acceder a los atributos de objeto desde los punteros almacenados a través de iteradores de contenedor. Pero siempre verifique para asegurarse de que el valor de retorno de hmap :: find () no sea igual a hmap :: end ().

Entonces, lo que describe está bien. Ahora, en cuanto a por qué los punteros en su tabla de variedades terminan apuntando a la basura, no podría decirlo sin más detalles. ¿Estás seguro de que no estás eliminando ningún objeto en ningún lado? ¿Estás seguro de que cuando copias punteros de un vector a otro, lo estás haciendo correctamente?

Otros consejos

si nunca delete ellos, entonces los punteros siguen estando bien. Por otro lado, es posible que desee mantener las cosas un poco más ordenadas y usar contenedores estándar para todo el 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top