首页 > 解决方案 > 指针如何变成地址 0xabababababababab 或 0xfeeefeeefeeefeee?

问题描述

我正在研究一个数据结构assignmnet并且发生了一些非常奇怪的事情,我的结构包含4棵avl树,在structre的析构函数中我使用delete删除了4棵树(树在构造函数中分配了new),一种方法该类称为 Quit ,它所做的只是调用析构函数“删除这个”,在调用 Quit 时以及在它操作任何命令之前(在执行“删除这个”之前)两个 avl 树已经为空,一个地址为 0x1一个是合法地址,但根的左右儿子是 0xabababababababab 和 0xfeeefeeefeeefeee 所以当调用析构函数并试图删除它们时,一个 SEGMENTAION FAULT 或 SEGTRAP accures ,因为 0xabababababababab 不是 NULL 并且函数没有进入如果(!节点){返回;并为正确的儿子递归调用,以及发生段错误的地方,因为访问 0xabababababab 的字段就像访问 NULL 的字段 进入“退出”之前的结构树图片

我不明白的是树木什么时候会发生这种情况?因为在调试时,在 Quit 之前的最后一个函数的末尾,字段和树都是 100% 预期的,所以它们都不会被删除,也不会在代码中以任何方式改变。我花了几天时间试图找到问题,请帮助。先感谢您。

标签: data-structuresmemory-leaksdestructoravl-treemagic-numbers

解决方案


0xABABABAB 用于HeapAlloc()在堆上分配内存后标记“无人区”保护字节。如果您访问它,您可能有缓冲区溢出。

0xFEEEFEEE 用于HeapFree()标记释放的堆内存。如果你访问这个,你可能有一个双重免费。

请注意,Debug Build 和 Release Build 中的内存布局是不同的。您可能不会在调试版本中收到该错误。

另请注意,在 IDE 中运行应用程序(从头开始附加调试器)和在没有调试器的情况下运行时,内存布局是不同的。从 IDE 内部运行时,您可能不会收到该错误。


推荐阅读