我正在处理一个数据结构assignmnet,发生了一些非常奇怪的事情,我的结构包含4个avl树,在结构的析构函数中,我使用delete删除了4个树(在构造函数中为这些树分配了new(,该类的一个方法被称为Quit,它所做的就是;删除此";调用析构函数时,当调用Quit时,在它操作任何命令之前(在执行"delete this"之前(,两个avl树已经为空,一个为地址0x1,另一个为合法地址,但根的左右子为0xababababab和0xfeeefeeeeeeeeee因此,当调用析构函数并试图删除它们时,会出现SEGMENTAION FAULT或SEGTRAP accures,因为0xabababababab不为NULL,并且函数不输入if(!node({return;},并递归地为正确的子调用,而在seg错误发生的地方,因为访问0xabababbabab的字段就像访问NULL的字段在进入"树"之前的结构树的图片;退出";
我不明白的是,这种情况什么时候发生在树上?因为在调试时,在Quit之前的最后一个函数的末尾,字段和树都是预期的100%,所以它们在代码中不会被删除或以任何方式更改。我花了好几天的时间试图找出问题,请帮忙。提前谢谢。
0xABABABAB由HeapAlloc()
用来标记";无人区";在堆上分配内存后保护字节。如果您访问此,则可能存在缓冲区溢出。
0xFEEEFEEE由HeapFree()
用来标记释放的堆内存。如果你访问这个,你可能有一个双免费。
请注意,Debug Build和Release Build中的内存布局不同。在调试生成中可能不会出现该错误。
还要注意,在IDE中运行应用程序(从一开始就附加调试器(和在没有调试器的情况下运行时,内存布局是不同的。从IDE内部运行时可能不会出现该错误。