微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指针如何变为地址 0xabababababababab 或 0xfeeefeeefeeefeee?

如何解决指针如何变为地址 0xabababababababab 或 0xfeeefeeefeeefeee?

我正在研究一个数据结构assignmnet,发生了一些非常奇怪的事情, 我的结构包含 4 个 avl 树,在结构的析构函数中,我使用 delete 删除了 4 个树(这些树在构造函数中分配了 new),该类的一个方法称为 Quit,它所做的只是“删除这个”调用析构函数,在调用 Quit 时以及在它操作任何命令之前(在执行“删除这个”之前)两个 avl 树已经为空,一个地址为 0x1,一个地址为合法地址,但是根是 0xababababababab 和 0xfeeefeeefeeefeee 因此,当调用析构函数并尝试删除它们时,SEGMENTAION FAULT 或 SEGTRAP accures ,因为 0xabababababababab 不是 NULL 并且功能不进入 if(!node){return;} 并递归调用正确的儿子,和seg 错误发生的地方,因为访问 0xababababababab 的字段就像访问 NULL 的字段 a pic of the structures trees before entering "Quit"

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

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。