迭代器中的分段错误

时间:2015-01-05 16:48:35

标签: c++ iterator segmentation-fault multimap

我为我的道路点创建了一个多图。关键是指道路编号,值是构成道路的vec3点。

我试图遍历每个关键点的值并在道路上的每个点创建一个路段(除了最后一个),调整值在路点上,然后将它们存储在std ::向量。

RoadSegment构造函数创建6个vec3点并将它们推送到std :: vector。

我在以粗体标记的行中有分段错误 [for(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 

1 个答案:

答案 0 :(得分:1)

问题似乎是你正在使用不存在的迭代器,这都是由于返回一个临时对象。

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

由于getMultiMapData()返回多图的副本,因此在执行该行后该多图会消失,从而导致任何迭代器无效。

一种解决方案是返回对多图的引用,而不是多图的新副本。

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