Основные вопросы: указатели на объекты в unordered_maps (C++)

Я новичок в программировании на C++ и буду очень признателен за ответы, в которых не требуется много предварительных знаний

Благодаря предложениям здесь, я создал неупорядоченную карту:

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

Данные на этой карте являются указателями на экземпляры класса Strain. Как только эти экземпляры созданы, я создаю для них указатели, а затем добавляю эти указатели в мою хэш-таблицу (hmap StraightTable) и в другой вектор (vector liveStrains), например,

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;

Экземпляры класса "Штамм" никогда не удаляются, и указатели на них не удаляются из таблицы-таблицы. Указатели время от времени перемещаются между вектором liveStrains и вектором deadStrains, но однажды в файле straTable они остаются в файле таблицы.

Это кошерный? Пока базовые экземпляры никогда не будут уничтожены, будут ли добавленные к ним указатели оставаться неизменными?

Также верно, что я всегда смогу получить атрибуты-члены из указателей в 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);
Другие вопросы по тегам