我是新的C ++编程,并会极大地认识到,不承担太多的先验知识的答复。

感谢这里的建议,我创建了一个无序的地图:

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

在此映射的数据是指针类菌株的实例。一旦创建这些实例中,创建指向它们的指针,并且我然后添加这些指针到我的哈希表(HMAP strainTable)和另一矢量(矢量<应变*> 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;

类菌株的实例是永远不会被删除,也不是指向它们的指针从strainTable除去。指针偶尔会矢量之间移动<应变*> liveStrains和矢量<应变*> deadStrains,但一旦上strainTable,它们留在strainTable。

这是洁净?只要底层实例永不破坏,将添加到它们中的指针保持不变?

时也正确,我应该总是能够通过使用,例如,对于第一条目,

获取部件从所述指针在属性strainTable
 hmap::const_iterator itr1 = strainTable.begin();
 int id = (itr1->second)->getStrainID();

我发现,一段时间后,指针在我strainTable点垃圾。

有帮助吗?

解决方案

,直到调用new在对象上的指针与delete分配的任何对象将仍然有效。您可以复制指针就像你喜欢的,作为底层的对象没有被删除,这将是只要有效。

其次,是的,你是正确的,可以访问对象经由容器迭代器从所存储的指针属性。但是,经常检查,以确保HMAP的返回值::找到()不等于HMAP ::结束()。

所以你的描述是好的。现在,至于为什么你strainTable指针都结束了指向垃圾,我不能没有更多的细节说。你确定你没有删除任何对象的任何地方?你肯定,当你从一个载体复制三分球给对方,你正在做正确?

其他提示

如果你从来没有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