使用MAP ITERETER可使用不良的存储器

Bad Acces Memory with map iterator

本文关键字:存储器 不良 可使用 MAP ITERETER 使用      更新时间:2023-10-16

可能的重复:
呼叫erase()

之后的std :: map :: iterator的问题

可能是您可以通过我目前遇到的问题来启发我。因此,问题在于,当我试图删除地图中的某些元素时,我会得到不良的访问记忆。我们假设以下类型:

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.
}

感谢您的帮助!真的很感激!

Aleks

您正在访问无效的迭代器。一旦将其传递给erase(),它就不再有效,因此您无法将其递增在for循环中。有关此的更多详细信息,请参见迭代器无效规则。

您的循环应该像这样构建,以避免访问无效的迭代器:

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++);
}

尽管我真的建议您阅读更多文档,并了解这里发生了什么。例如,请参阅此。

祝你好运!

替代:

while ((Map::iterator iter = documents.begin()) != documents.end())
{
   std::string s = * ( iter->first);
   Document dd = * (iter->second);
   std::cout << s << " || " << dd;
   documents.erase(iter);
}