(不是)指针调整破坏我的日子和堆? (C ++)

时间:2011-06-01 14:49:09

标签: c++ casting heap corruption

-edit2-我走错了路。我通过纠正一个拼写错误并添加一行来修复疏忽来解决这个问题,这个疏忽允许我在一个数组上写入4个字节。

-edit-也许我正在经历一条错误的道路。也许VS向我显示不正确的数据,但仍然正确运行代码(在我的所有代码确实显示正确的名称之后)。但我不知道我的堆腐败可能来自哪里。

我没有发现任何问题或数据不正确。但我注意到随机崩溃和建议,它是由腐败堆引起的。

我调查了一些东西,这是我注意到的。我在地址0x00216e98有一个班级。在我的手表中,我可以正确地看到数据,下面你可以看到名称ptr是21bc00。我将ptr作为基类返回(我们称之为Base),它被插入到双端队列中。正如你在deque(ls)中看到的,它有一个元素,第一个元素是正确的指针(我认为它可以调整,但我猜不是。但也许它只是......)。

但是它拥有的成员是完全不正确的cdcdcd00对我来说看起来不像是有效的名字ptr而且与下面的ptr不匹配。此外,当我的代码运行时,我会以某种方式得到正确的名称,所以我不知道什么是正确/错误。它可能是dynamic_cast魔法,但无论如何,如果我仍然抓取正确的数据,我不知道我是如何破坏堆(在gcc和msvc中)。

我会注意到我对'Base'类有钻石继承,但就像我说我仍在提取正确的数据而我没有使用虚拟基础。

enter image description here

2 个答案:

答案 0 :(得分:1)

如果您使用的是Linux,则可以使用Valgrind。这是查找堆相关问题的优秀工具。

答案 1 :(得分:1)

在调试模式下,cdcdcdcd是已删除未初始化的内存,调试堆正在为您标记。

如果你看到了,你正在使用指向已删除结构的指针。已分配但从未给出值的内存。