2013-09-26 154 views
0

我想插入一個指向對象的指針到地圖中。這是正確的方式嗎?C++地圖元素插入

object myobject[10]; 
.... 
mymap.insert(std::pair<int,object*>(pktctr, &myobject[pktctr])); 
+1

是的,如果您想在未定義行爲的情況下測試您的平臺所做的工作是正確的方式 –

+4

@BЈовић:未定義的行爲在哪裏?它看起來很好,只要'pktctr'在範圍內並且指針在'myobject'被銷燬之前被移除。我錯過了什麼嗎? –

+0

@MikeSeymour @MikeSeymour這是很多假設:)我假設myobject是在堆棧中的一個方法,並且它超出了範圍 –

回答

2

這是正確的方式?

是的,雖然它可能會讀,如果你使用的make_pair更好:

mymap.insert(std::make_pair(pktctr, &myobject[pktctr])); 

或C++語法11:

mymap.insert({pktctr, &myobject[pktctr]}); 

唯一的危險是,你必須確保在在myobject被銷燬之前(或至少確保指針在此之後從未被使用)之前,指針被移除或者地圖被銷燬。否則,你將有一個懸掛指針和整個世界的錯誤等待發生。

+0

如果我在myobject被銷燬之前清除析構函數中的映射,那麼罰款是否好? –

+0

@AvbAvb:是的:唯一的危險是如果在對象被銷燬後使用指針*。 –

2

這將工作和是正確的(即不產生不確定的行爲),只要下列條件成立一個:

  • mymapmyobject有相同的壽命(他們在同一範圍內進行申報):你一定會那麼地圖經久陣列
  • 指針myobject使用壽命結束前被移除(你會和懸擺指針的話,指針的東西,不存在了)

確保pktctr永遠不會超過數組的末尾。

最後,這句法也將工作:

mymap[pktctr] = &myobject[pktctr]; 

編輯:

其實,我清除地圖在析構函數爲MyObject被破壞之前。

然後,你不應該有任何懸掛指針問題AFAIK。