Этот вопрос является результатом моего предыдущего вопроса о создании хеш-таблицы для хранения строковых ключей и указателей в качестве данных. Я получаю пост-конструкцию ошибки сегмента, когда пытаюсь добавить записи в мою хэш-таблицу. Я все еще очень озадачен тем, какой синтаксис уместен.
У меня сейчас (спасибо предыдущим авторам):
// Simulation.h
#include <ext/hash_map>
using namespace __gnu_cxx;
...
typedef struct { size_t operator()( const string& str ) const
{ return __gnu_cxx::__stl_hash_string( str.c_str() ); } } strhash;
struct eqstr {
bool operator()(string s1, string s2) const {
return ( s1.compare(s2) == 0 );
}
};
....
hash_map< string, Strain *, strhash, eqstr > strainTable;
В моем конструкторе Simulation у меня есть:
// Simulation.cpp
Simulation::Simulation() : ... {
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 );
strainTable[ MRCA ]= firstStrainPtr; // <-- Hash table initialization
....
}
Кажется, это работает нормально. Я получаю ошибку сегмента при попытке следующей вставки:
void Simulation::updateSimulation( double t ) {
....
// Add mutants to liveStrains() and strainTable
vector< Strain * >::const_iterator mItr = newMutants.begin();
for ( mItr = newMutants.begin(); mItr != newMutants.end(); ++mItr ) // for each mutant in deme
{
string mutantSeq = ( *mItr )->getSequence();
cout << "mutantSeq is " << mutantSeq << endl; // <-- This is fine
liveStrains.push_back( *mItr );
strainTable[ mutantSeq ] = *mItr; // <-- Seg fault happens here
}
newMutants.clear();
....
}
Читая третью заметку об операторе [] в документации SGI , похоже, все должно быть в порядке. В чем дело? Я думаю о переходе на контейнер карт, чтобы сэкономить время отладки ...
Обновление
Что-то в инициализации кажется неправильным. Когда я доберусь до
strainTable[ mutantSeq ] = *mItr;
отладчик сообщает «EXC_BAD_ACCESS» и переходит на
_Node* __first = _M_buckets[__n];
из hashtable.h.