我在多线程环境中遇到问题。我有一个正确的“Multiple Read-Single Write”锁定环境,修改了std::list
。 我现在的问题是,我收到一封“列表迭代器不dereferencable” -exception和Visual只显示这一点,如果我检查它:std :: list容器填充错误的常见原因
在列表中的第一项的值为“0xcdcdcdcd” 。
可能是什么原因?我很乐意为您提供更多的细节,但我不知道从哪里开始,它已经耗费了几天的时间来调试它,但是如果代码以断点运行,则不会发生这种情况。
UPDATE
我有现在降低至一个更简单的问题(可惜仍然无法将其降低到一个小的非工作的例子)。它现在只能在单线程环境下运行 - 所以不能再应用多线程问题。
该列表中充满了5000个元素,我打电话给data.resize(100)
,它崩溃了 - 删除了3500个元素。 每个元素总是处理完全一样,它们全部包含在shared_ptr<>
我不保存任何迭代器,可能会失效,它只是通过删除列表中的随机元素而崩溃。 我不知道从哪里开始。
“但如果代码与断点一起运行,则不会发生这种情况。”这表明一个竞争条件,使您的迭代器失效 – SingerOfTheFall
底层容器是一个std :: list,它并不关心插入/删除时的迭代器失效(当然除去已删除的元素) - 但为什么调试器仍然显示已删除的元素? – EGOrecords
http://en.wikipedia.org/wiki/Magic_number_(programming)建议0xCCCCCCCC:由微软的C++调试运行时库用来标记未初始化的堆栈内存 –