我在多线程环境中遇到问题。我有一个正确的“多读-单写”-Lock 设置环境,它修改了 std::list
.
我现在的问题是,我收到一个“列表迭代器不可取消引用”异常,而 Visual 仅在我检查它时显示它:
列表中的第一项的值为“0xcdcdcdcd”。
可能是什么原因?我很乐意为您提供更多详细信息,但我不知道从哪里开始,它已经花费了我几天的调试时间,但如果代码运行时带有断点,则不会发生这种情况。
更新
我现在已经将它简化为一个更简单的问题(遗憾的是仍然无法将其简化为一个小的非工作示例)。它现在仅在单线程环境中运行 - 因此不会再出现多线程问题。
列表中有大约 5000 个元素,我调用 data.resize(100)
它崩溃了——删除了 ~3500 个元素。
每个元素总是被完全相同地处理,它们都包含在 shared_ptr<>
中
我不保存任何可能无效的迭代器,它只是因为删除了列表中的随机元素而崩溃。 我不知道从哪里开始。
最佳答案
您是否在容器内使用 std::auto_ptr
?
auto_ptr
在新版本的 C++ 中已弃用,应谨慎使用。
auto_ptr
不能很好地复制,因此绝不能在容器内使用。
Why it is wrong to use std::auto_ptr<> with standard containers
如果 C++11 不可用,请使用 std::shared_ptr
或其他智能指针(例如来自 boost)。
关于c++ - std::list 容器充满错误的常见原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33099155/