gpt4 book ai didi

c++ - 段错误执行方法

转载 作者:行者123 更新时间:2023-11-30 02:04:48 24 4
gpt4 key购买 nike

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

我遇到的第一个问题是,在 while 循环结束后,我需要在 baseabsorbed 集群中执行其他操作。从我的搜索中,我找到了 = &(*li) 东西。我的理解是,我得到一个指向元素 li 指向的地址的指针,虽然我不能做 absorbed = li,因为一个是迭代器,另一个是(简单?) ponter。我会很感激对此的一些解释。

现在,更大的问题是我在方法 joinCluster()c->getPoints(); 行中遇到了一个 sementation 错误我究竟做错了什么?我应该怎么做?为什么?

我在 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();
};

最佳答案

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 block 中。

另请注意,当您从容器中删除 li 时,absorbed 持有无效地址。

关于c++ - 段错误执行方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10166462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com