2015-01-05 61 views
0

我爲我的道路點創建了一個多圖。關鍵是指道路編號,值是構成道路的vec3點。迭代器中的段錯誤

我試圖遍歷每個關鍵點的值,並在道路上的每個點(除最後一個)上創建一個路段,將值調整到道路點上,然後將它們存儲在std中: :向量。

的RoadSegment構造函數創建6個VEC3點和推動它們到一個std ::向量。

我有一個分段故障在標誌着線粗體 [對於(mapit地圖= it.first; mapit地圖= it.second;!++ mapit地圖)]

當我取出創建新的線對象並將它們推到std :: vector上,它工作正常。

誰能告訴我是什麼問題/解決問題的解決方案?

提前感謝

std::vector<glm::vec3>::iterator SegIt; 

for(int i = 0; i < m_genRoads->getKeyValueData().size(); i++) 
{ 
    int numberDesired = m_genRoads->getMultimapData().count(i) - 1; 

    std::multimap<int, glm::vec3>::iterator mapIt; 
    std::pair<std::multimap<int, glm::vec3>::iterator, std::multimap<int, glm::vec3>::iterator> it; 

    it = m_genRoads->getMultimapData().equal_range(i); 


    for(mapIt = it.first; mapIt != it.second; ++mapIt) 
    { 

     int distance = std::distance(it.first, mapIt); 

     if(distance != numberDesired) 
     { 
      RoadSegement* roadSegmentPointer = new RoadSegement(); 

      // FUNCTIONS TO ADJUST COORD VALUES TO MATCH THE ROAD POINTS 


      m_segmentArray.push_back(roadSegmentPointer); 

     } 

     else 
     { 
      continue; 
     } 

     ///SOME BUFFER BINDING STUFF 
+0

可能與++ mapit地圖你出去你的地圖的空間。嘗試在mapit地圖++ –

+0

改變我只是想這一點,但沒有奏效....仍然給分段錯誤 – willgosling

+1

@FrankCunningham:'++ mapIt'和'mapit地圖++'* *做同樣的事情;唯一的區別是表達式的值(在增量之前或之後),這個代碼忽略了這個值。 –

回答

1

這個問題似乎是,你使用的是不存在的迭代器,全因返回臨時對象。

it = m_genRoads->getMultimapData().equal_range(i);

getMultiMapData()由於返回多重映射的副本,執行行之後,因此使任何迭代無效該多重映射不見了。

一種解決方案是一個參考返回多重映射,而不是多重映射的新副本。

std::multimap<int, glm::vec3>& GenerateRoads::getMultimapData() { return m_roadsMultimap; }

+0

這真是太棒了,謝謝你。這是否意味着調用循環中使用的返回值的任何函數都應該返回一個引用,或者它是個案的事情嗎? – willgosling

+0

它與循環無關。你不能使用迭代器來存儲不存在的容器。從函數返回的值會創建一個新的臨時對象,然後再次消失,因此任何進入該臨時對象的迭代器都會立即失效。 –

+0

這個問題是對象生命週期的問題。在您的原始代碼中,返回的multimap將持續到下一個語句。通過返回一個引用,你返回的是你的類使用的相同的多重映射,而不是副本。返回副本沒有任何內在的錯誤,但是您必須確保副本的持續時間長達您想要的時間,而您的情況則不會。 – PaulMcKenzie