c++ - 带有映射迭代器的错误访问内存

标签 c++ dictionary iterator

<分区>

Possible Duplicate:
Problem with std::map::iterator after calling erase()

也许你可以启发我目前遇到的问题。 所以问题是当我试图删除 map 中的某些元素时,我得到了一个错误的访问内存。 我们假设以下 typedef :

typedef std::map < std::string *, Document *, pStringCompare > Map;

我们假设在执行以下所有代码之前,我们已经实例化了一个包含两个元素(例如)的 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.
}

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

亚历克斯

最佳答案

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

祝你好运!

关于c++ - 带有映射迭代器的错误访问内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13314349/

相关文章:

c++ - 从另一个类 C++ 访问对象

Python - 在字典中查找值的交集

c++ - 将迭代器传递给模板

swift - 如何在 Swift 中扩展 String.Iterator

c++ - 迭代器指向哪个索引

C++ - 无法实例化抽象类

c++ - 有没有办法在 C++ 中连接两个数组并返回它们?

c++ - 为什么 `clang-format`和 `git clang-format`的结果不同

python - 将单个值分配给具有多个值的字典键中的单个键

python - 这种方法是否有更快的替代方法来从字典列表中获取最后更新消息?