questões básicas: Ponteiros para objetos em unordered_map (C ++)
-
22-07-2019 - |
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
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
É 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.
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);