【问题标题】:Bad Acces Memory with map iterator [duplicate]带有映射迭代器的错误访问内存[重复]
【发布时间】:2012-11-09 19:06:59
【问题描述】:

可能重复:
Problem with std::map::iterator after calling erase()

也许你能告诉我我目前遇到的一个问题。 所以问题是当我试图擦除地图中的一些元素时,我得到了一个糟糕的访问内存。 我们假设以下 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.
}

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

亚历克斯

【问题讨论】:

  • 你确定是发生错误的那一行吗?我希望它发生在增量 (it++) 上,因为在调用 erase() 之后,it 变为 invalid

标签: c++ map iterator


【解决方案1】:

您正在访问无效的迭代器。一旦你将它传递给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

祝你好运!

【讨论】:

  • 感谢您的帮助和文档,非常有帮助!
【解决方案2】:

或者:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多