使用MAP ITERETER可使用不良的存储器
Bad Acces Memory with map iterator
可能的重复:
之后的std :: map :: iterator的问题
呼叫erase()
可能是您可以通过我目前遇到的问题来启发我。因此,问题在于,当我试图删除地图中的某些元素时,我会得到不良的访问记忆。我们假设以下类型:
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);
}
相关文章:
- 为什么"using System;"不被视为不良做法?
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 删除复制构造函数的 Intel 13.1.2 中不良C++行为的解决方法
- 如果 constexpr 和依赖假static_assert形成不良?
- 将C#结构的存储器大小与C 结构匹配
- 不从成员函数C 存储返回值认为不良习惯
- shared_from__this,asio的不良弱ptr例外
- 如何将图像数据从搜索窗口中移动到本地存储器OpenCL
- 试图初始化矩阵C 时的不良同种
- 创建以不良输出结束
- 检测`boost :: Math ::工具:: brent_find_minima()的不良输入
- 如何在以下C程序中计算运行时间内存和最大数据存储器使用情况
- C HTTP POST 400不良请求
- OPENCV错误:不良的参数(字节必须为16、32或64)在简介Descriptorextractorimpl中
- 使用c中的结构的malloc通过大量存储器进行索引
- 请求在C和C 中存储器的缓存
- 与全球矢量的不良同种
- 限制C++中允许的模板参数是否被认为是不良样式?
- 从触摸回调访问向量元素的方法时,不良访问错误
- 使用MAP ITERETER可使用不良的存储器