c++ - std::list 容器充满错误的常见原因

标签 c++ visual-c++

我在多线程环境中遇到问题。我有一个正确的“多读-单写”-Lock 设置环境,它修改了 std::list . 我现在的问题是,我收到一个“列表迭代器不可取消引用”异常,而 Visual 仅在我检查它时显示它:

data shows only (error) in visual debugger

列表中的第一项的值为“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/

相关文章:

winapi - 对 OututDebugString 的调用是否应该包含在 #ifdef DEBUG 条件 block 中?

c++ - 如何创建一个新线程并在一段时间后终止它?

visual-c++ - 使用 CComVariant 访问 SafeArray 时出现问题

c++ - 使用 CFileDialog 打开文件失败时如何捕获异常

c++ - 有没有办法用编译指示禁用所有警告?

c++ - 从另一个子集中的子集中访问超集变量

C++/Windows API - 无法找到 CreateWindow

c++ - 对指针的引用与对 int 的引用

c++ - 关于从字符数组转换为字符串的问题 - C++

c++ - 视觉 C++ : memory debugger refresh while running