2009-10-31 85 views
4

我不熟悉C++編程,並非常感謝不承擔更多先驗知識的回覆。基本問題:指向unordered_maps中對象的指針(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; 

類Strain的實例永遠不會被刪除,指針也不會從StressTable中刪除。指針偶爾會在矢量< Strain *> liveStrains和矢量< Strain *> deadStrains之間移動,但是一旦在strainTable上,它們會停留在strainTable上。

這是猶太教嗎?只要基礎實例永遠不會被銷燬,添加到它們的指針會保持不變?

是不是也是正確的,我應該總是能夠通過使用,例如,對於第一個條目獲取成員來自三分球strainTable屬性,

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

我發現了一段時間後,指針在我的張力表中指向垃圾。

+0

除非您調用應變指針上的刪除,它們不會被釋放,但可能存在其他事情,例如在未分配的區域中寫入。爲Strain編寫一個析構函數並編寫一些調試打印語句或拋出異常來查看調用堆棧,如果您懷疑Strain以某種方式被釋放。 – 2009-10-31 01:43:53

回答

2

指向與new分配的任何對象將仍然有效。您可以儘可能多地複製指針,只要底層對象沒有被刪除,它就會有效。

其次,是的,您可以通過容器迭代器從存儲的指針訪問對象屬性。但總是檢查以確保hmap :: find()的返回值不等於hmap :: end()。

所以你描述的很好。現在,至於爲什麼你的strainTable中的指針最終指向垃圾,我不能說沒有更多的細節。你確定你沒有刪除任何地方的任何對象?你確定當你從一個向量複製指針到另一個時,你是否正確地做了這件事?

+0

謝謝。我沒有意識到它會仔細檢查hmap :: find()!= hmap :: end()。稍後,我將使用調試器仔細檢查代碼,以查看奇怪的起點。既然我不叫'刪除',我敢肯定我沒有刪除任何東西,但是我的指針很可能會被搞亂。我將重構散列表以使數據具有Strains(而不是Strain *),並查看是否有幫助。 – Sarah 2009-10-31 01:10:15

1

如果你從來沒有delete他們,那麼指針仍然沒問題。另一方面,您可能希望保持整潔,使用標準容器來保存整個shebang。直到你的對象調用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); 
+0

聖牛,這很有道理。我原本有矢量< Strains > liveStrains(和deadStrains相同),然後我意識到我需要這個哈希映射,所以我切換到liveStrains的指針 - 但保留散列表中的Strain對象要好得多。也感謝您展示語法。 – Sarah 2009-10-31 01:06:23

+0

p.s.我需要liveStrains成爲一個向量,因爲我在模擬中迭代了很多次 - 在這種情況下,我認爲向量比unordered_map快。 – Sarah 2009-10-31 01:30:00

+0

是的,當然'std :: vector '可以正常工作,如果這是您需要的。 – SingleNegationElimination 2009-10-31 15:49:10