gpt4 book ai didi

c++ - 取消引用集合迭代器会导致seg错误

转载 作者:行者123 更新时间:2023-12-02 10:25:51 25 4
gpt4 key购买 nike

我正在尝试确定以下代码为什么在第10行(在这里我们取消引用upgradeIter)上引发段错误。

bool UpgradeType::isAffected(const UnitType *unitType) const{
if(std::find(effects.begin(), effects.end(), unitType)!=effects.end()) return true;

// Check if the unit has any of the affected tags
std::set<string>::iterator upgradeIter;
for(upgradeIter = tags.begin(); upgradeIter != tags.end(); ++upgradeIter) {
std::set<string>::iterator unitIter;
for(unitIter = unitType->getTags().begin(); unitIter != unitType->getTags().end(); ++unitIter) {
string unitTag = *unitIter;
string upgradeTag = *upgradeIter;
if(unitTag == upgradeTag) return true;
}
}

return false;
}

上下文是 UpgradeType具有“标签”(只是一组字符串)。单位也有标签。如果单元与升级共享至少一个标签,则该单元会受到升级的影响。

我看不到上述行崩溃的任何原因。在我看来,在任何情况下迭代器都可能无效。

在显示 tags内容的代码的其他部分(使用方式非常相似),输出是预期的。

编辑:我刚刚发现 unitType->getTags().size()为0。所以我不明白为什么for循环的主体甚至被执行。 unitIter != unitType->getTags().end()评估为true。这似乎关闭。

最佳答案

我设法在Yggdrasil on this site的帮助下找到了解决方案(这也意味着问题注释中的Matt McNabb是正确的)。在下面引用他的帖子:

As someone more or less mentioned on stackoverflow: Change getTags() to return a reference, not a value/copy.

const set &getTags() const {return tags;}

Be aware that the return type is const, so use a const iterator.

Not sure if that's all, but you don't want a (deep) copy there, for sure. The iterator gets out of bounds because you check against the end of a different set. Every call to getTags() gets its own copy.

关于c++ - 取消引用集合迭代器会导致seg错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25101181/

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