Основные вопросы: указатели на объекты в unordered_maps (C ++) - PullRequest
4 голосов
/ 31 октября 2009

Я новичок в программировании на 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;

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 31 октября 2009

Указатель на любой объект, выделенный с помощью new, будет оставаться действительным до тех пор, пока вы не вызовете delete для объекта. Вы можете скопировать указатель сколько угодно, и он будет действителен до тех пор, пока базовый объект не будет удален.

Во-вторых, да, вы правы, что вы можете получить доступ к атрибутам объекта из сохраненных указателей через контейнерные итераторы. Но всегда проверяйте, чтобы возвращаемое значение hmap :: find () не было равно hmap :: end ().

То, что вы описываете, прекрасно. Теперь, что касается того, почему указатели в вашем файле таблицы могут указывать на мусор, я не могу сказать без более подробной информации. Вы уверены, что нигде не удаляете объекты? Вы уверены, что когда вы копируете указатели с одного вектора на другой, вы делаете это правильно?

1 голос
/ 31 октября 2009

если вы никогда не 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);
...