Pergunta

Eu sou novo para C ++ programação e gostaria muito de receber respostas que não assumem muito conhecimento prévio.

Graças a sugestões aqui, criei um mapa não ordenada:

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

Os dados deste mapa são ponteiros para instâncias de Strain classe. Assim que estas instâncias são criadas, eu criar ponteiros para eles, e eu, em seguida, adicionar esses ponteiros para minha tabela hash (HMAP strainTable) e para outro vector (vector liveStrains), por exemplo.,

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;

Instâncias de Strain classe nunca são apagadas, nem são ponteiros para eles retirados do strainTable. Ponteiros ocasionalmente mover entre vector liveStrains e vector deadStrains, mas uma vez no strainTable, eles ficam em strainTable.

É este kosher? Enquanto os casos subjacentes nunca são destruídos, será que os ponteiros adicionados a eles permanecem intactos?

É também correto que eu deveria sempre ser capaz de obter atributos de membro dos ponteiros em strainTable usando, por exemplo, para a primeira entrada,

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

Eu estou achando que depois de um tempo, os ponteiros no meu ponto strainTable de lixo.

Foi útil?

Solução

Um ponteiro para qualquer objeto alocado com new permanecerá válida até que você chamar delete no objeto. Você pode copiar o ponteiro tanto quanto você gosta, e será válido enquanto o objeto subjacente não foi excluída.

Em segundo lugar, sim, você está correto que você pode acessar atributos de objeto dos ponteiros armazenados via iterators recipiente. Mas sempre verifique se que o valor de retorno de HMAP :: find () não é igual a HMAP :: end ().

Então, o que você descreve é ??bom. Agora, segundo a qual os ponteiros em seu strainTable estão terminando apontando para o lixo, eu não poderia dizer, sem mais detalhes. Tem certeza de que não está excluindo quaisquer objetos em qualquer lugar? Tem certeza de que quando você copiar ponteiros de um vector para o outro, você está fazendo isso corretamente?

Outras dicas

Se você nunca delete-los, em seguida, os ponteiros são ainda ok. Por outro lado, você pode querer manter as coisas um pouco mais arrumado e usar recipientes padrão para a coisa toda.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top