可能你可以通过我目前遇到的问题来启发我。 所以问题是当我试图擦除地图中的某些元素时,我得到了一个糟糕的访问内存。 我们假设以下typedef:
typedef std::map < std::string *, Document *, pStringCompare > Map;
我们假设在执行以下所有代码之前,我们已经实例化了一个包含两个元素(例如)的映射。 这段代码工作得很好:
Map::iterator it = documents.begin();
std::string *s = it->first;
Document *d = it->second;
documents.erase(it);
delete d;
delete s;
但是当我试图用迭代器循环时,我得到了错误。
for (Map::iterator it = documents.begin() ; it != documents.end() ; it++)
{
std::string s = * ( it->first);
Document dd = * (it->second);
std::cout << s << " || " << dd;
documents.erase(it); // This line causes the bad access memory error.
}
感谢您的帮助!真的很感激!
阿莱克斯
答案 0 :(得分:5)
您正在访问无效的迭代器。将其传递给erase()
后,它将不再有效,因此您无法在for
循环中增加它。有关详细信息,请参阅Iterator Invalidation Rules。
你的循环应该像这样构造,以避免访问无效的迭代器:
for (Map::iterator it = documents.begin() ; it != documents.end() ; )
{
std::string s = * ( it->first);
Document dd = * (it->second);
std::cout << s << " || " << dd;
documents.erase(it++);
}
虽然我真的建议您阅读更多文档并了解这里发生了什么。例如,请参阅this。
祝你好运!
答案 1 :(得分:1)
可替换地:
while ((Map::iterator iter = documents.begin()) != documents.end())
{
std::string s = * ( iter->first);
Document dd = * (iter->second);
std::cout << s << " || " << dd;
documents.erase(iter);
}