-edit2-我走错了路。我通过纠正一个拼写错误并添加一行来修复疏忽来解决这个问题,这个疏忽允许我在一个数组上写入4个字节。
-edit-也许我正在经历一条错误的道路。也许VS向我显示不正确的数据,但仍然正确运行代码(在我的所有代码确实显示正确的名称之后)。但我不知道我的堆腐败可能来自哪里。
我没有发现任何问题或数据不正确。但我注意到随机崩溃和建议,它是由腐败堆引起的。
我调查了一些东西,这是我注意到的。我在地址0x00216e98有一个班级。在我的手表中,我可以正确地看到数据,下面你可以看到名称ptr是21bc00。我将ptr作为基类返回(我们称之为Base),它被插入到双端队列中。正如你在deque(ls)中看到的,它有一个元素,第一个元素是正确的指针(我认为它可以调整,但我猜不是。但也许它只是......)。
但是它拥有的成员是完全不正确的cdcdcd00对我来说看起来不像是有效的名字ptr而且与下面的ptr不匹配。此外,当我的代码运行时,我会以某种方式得到正确的名称,所以我不知道什么是正确/错误。它可能是dynamic_cast魔法,但无论如何,如果我仍然抓取正确的数据,我不知道我是如何破坏堆(在gcc和msvc中)。
我会注意到我对'Base'类有钻石继承,但就像我说我仍在提取正确的数据而我没有使用虚拟基础。
答案 0 :(得分:1)
如果您使用的是Linux,则可以使用Valgrind。这是查找堆相关问题的优秀工具。
答案 1 :(得分:1)
在调试模式下,cdcdcdcd是已删除未初始化的内存,调试堆正在为您标记。
如果你看到了,你正在使用指向已删除结构的指针。已分配但从未给出值的内存。