我正在尝试确定以下代码为什么在第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是正确的)。在下面引用他的帖子: