带有映射迭代器的坏访问内存

Ale*_*eks 2 c++ iterator map

可能重复:
调用erase()后std :: map :: iterator出现问题

也许你可以用我目前遇到的问题来启发我.所以问题是当我试图擦除地图中的某些元素时,我得到了一个糟糕的访问内存.我们假设以下typedef:

typedef std::map < std::string *, Document *, pStringCompare > Map;
Run Code Online (Sandbox Code Playgroud)

我们假设在执行以下所有代码之前,我们已经实例化了一个包含两个元素的映射(例如).这段代码很棒:

Map::iterator it = documents.begin();

std::string *s = it->first;
Document *d = it->second;

documents.erase(it);

delete d;
delete s;
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用迭代器循环时,我得到了错误.

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.
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助 !非常感谢!

阿莱克斯

小智 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++);
}
Run Code Online (Sandbox Code Playgroud)

虽然我真的建议你阅读更多文档并了解这里发生了什么.例如,看到这个.

祝好运!