data-structures - 指针如何变成地址 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% 预期的,所以它们都不会被删除,也不会在代码中以任何方式改变。我花了几天时间试图找到问题,请帮助。先感谢您。
解决方案
0xABABABAB 用于HeapAlloc()
在堆上分配内存后标记“无人区”保护字节。如果您访问它,您可能有缓冲区溢出。
0xFEEEFEEE 用于HeapFree()
标记释放的堆内存。如果你访问这个,你可能有一个双重免费。
请注意,Debug Build 和 Release Build 中的内存布局是不同的。您可能不会在调试版本中收到该错误。
另请注意,在 IDE 中运行应用程序(从头开始附加调试器)和在没有调试器的情况下运行时,内存布局是不同的。从 IDE 内部运行时,您可能不会收到该错误。
推荐阅读
- c# - 获取类实现的接口
- git - 如何从存储库克隆并使用 git 带来所有远程分支?
- python - OSMNX RuntimeError: b'没有这样的文件或目录'
- bash - 保存别名命令的默认行为
- ios - 启动应用程序后如何重新加载tableview如果每次都有新内容出现在数组中并且如果数组相同则不需要重新加载
- c# - Directory.Exists 之后的 DirectoryNotFoundException
- java - 如何将空的 DateTime 插入 MS Access 数据库?
- javascript - 回发后如何保留动态创建的控件
- arrays - 如何使用键作为数组值创建 json
- airflow - 气流中的 Dag 脚本