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

StackOverflow https://stackoverflow.com/questions/1652901

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

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

Данные на этой карте являются указателями на экземпляры класса Strain. Как только эти экземпляры созданы, я создаю для них указатели, а затем добавляю эти указатели в мою хэш-таблицу (hmap StraightTable) и в другой вектор (vector & Lt; Strain * & Gt; 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;

Экземпляры класса Strain никогда не удаляются, и указатели на них не удаляются из straTable. Иногда указатели перемещаются между вектором & Lt; Напряжение * & GT; liveStrains и vector < Напряжение * & GT; deadStrains, но когда-то на straTable, они остаются на straTable.

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

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

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

Я обнаружил, что через некоторое время указатели в моей таблице переходов указывают на мусор.

Это было полезно?

Решение

Указатель на любой объект, выделенный с помощью 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top