Основные вопросы: указатели на объекты в unordered_maps (C++)
Я новичок в программировании на C++ и буду очень признателен за ответы, в которых не требуется много предварительных знаний
Благодаря предложениям здесь, я создал неупорядоченную карту:
typedef std::tr1::unordered_map<std::string, Strain*> hmap;
Данные на этой карте являются указателями на экземпляры класса Strain. Как только эти экземпляры созданы, я создаю для них указатели, а затем добавляю эти указатели в мою хэш-таблицу (hmap StraightTable) и в другой вектор (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;
Экземпляры класса "Штамм" никогда не удаляются, и указатели на них не удаляются из таблицы-таблицы. Указатели время от времени перемещаются между вектором
Это кошерный? Пока базовые экземпляры никогда не будут уничтожены, будут ли добавленные к ним указатели оставаться неизменными?
Также верно, что я всегда смогу получить атрибуты-члены из указателей в straTable, используя, например, для первой записи,
hmap::const_iterator itr1 = strainTable.begin();
int id = (itr1->second)->getStrainID();
Я обнаружил, что через некоторое время указатели в моей таблице ссылок указывают на мусор.
2 ответа
Указатель на любой объект, выделенный с new
останется в силе, пока вы не позвоните delete
на объекте. Вы можете скопировать указатель сколько угодно, и он будет действителен до тех пор, пока базовый объект не будет удален.
Во-вторых, да, вы правы, что вы можете получить доступ к атрибутам объекта из хранимых указателей через контейнерные итераторы. Но всегда проверяйте, чтобы убедиться, что возвращаемое значение hmap::find() не равно hmap::end().
Так что то, что вы описываете, хорошо. Теперь, что касается того, почему указатели в вашей таблице типов указывают на мусор, я не могу сказать без более подробной информации. Вы уверены, что нигде не удаляете объекты? Вы уверены, что когда вы копируете указатели с одного вектора на другой, вы делаете это правильно?
Если ты никогда delete
их, то с указателями все в порядке. С другой стороны, вы можете захотеть сохранить порядок и использовать стандартные контейнеры для всего шебанга.
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);