分段故障执行方法

时间:2012-04-15 21:51:38

标签: c++ pointers iterator

我编码的相关(我认为)行如下。 意思是有一个集群列表。 其中一个base将吸收另一个(aborbed)。 aborbed群集应从list删除。

我遇到的第一个问题是,在base周期关闭后,我需要在absorbedwhile群集中执行其他操作。 从我的搜索中,我找到了= &(*li)的东西。我理解的是,我得到一个指向元素li的地址的指针,虽然我不能做absorbed = li,因为一个是迭代器,另一个是(简单?)ponter。我很欣赏这方面的一些解释。

现在,更大的问题是我在方法c->getPoints();的行joinCluster()中出现了分段错误 我究竟做错了什么?我该怎么办?

我在Linux x86_64中使用g ++(GCC)4.5.2。

Cluster * base;
Cluster * absorbed;

list<Cluster>::iterator li = clusters.begin(); 
while ( li != clusters.end() ) {   
    if (li->getId() == p2) {
        absorbed = &(*li);
        li = clusters.erase(li);
    } else if (li->getId() == p1) { 
        base = &(*li);
    }
++li;
}

base->joinCluster(absorbed);


void Cluster::joinCluster(Cluster * c)
{
    set<unsigned int> pts = c->getPoints(); 
}

set<unsigned int> Cluster::getPoints()
{
return points;
}

class Cluster {
    private:
    std::set<unsigned int> points;
    public:
    std::set<unsigned int> getPoints();
};

1 个答案:

答案 0 :(得分:4)

list<Cluster>::iterator li = clusters.begin(); 
while ( li != clusters.end() ) {   
    if (li->getId() == p2) {
        absorbed = &(*li);
        li = clusters.erase(li);
    } else if (li->getId() == p1) { 
        base = &(*li);
    }
++li;   // <----  Don't increment when you already deleted.
}

当您删除列表中的最后一个元素时,li变为cluster.end()。然后你再次增加它并且繁荣,你出界了。 ++li应该else阻止。

另请注意,当您从容器中删除li时,absorbed会收到无效的地址。

相关问题