带父指针的二叉树执行删除操作时出现0xDDDDDDDD错误崩溃如何解决?
问题原因分析
delete操作不会自动将指向该内存的指针置为nullptr。你删除值为22的左子节点后,父节点(root)的left成员仍然指向已经被释放的内存地址,并没有被自动修改为nullptr。Windows平台Debug模式下,被释放的堆内存会被填充为0xDD,所以你读取这个被释放地址的value值就会得到-572662307,对应的指针值就是你遇到的0xDDDDDDDD。DeleteAll的遍历逻辑存在缺陷。你删除叶子节点回到父节点后,仍然会优先判断左指针是否非空,这时候左指针是野指针而非nullptr,会触发非法内存访问直接崩溃,而且你的逻辑也没有处理删除左子节点后再遍历右子节点的场景,就算没有野指针问题也删不完整棵树。
正确实现方案
整树删除的标准实现是用后序遍历,先递归删除左子树、再递归删除右子树,最后删除当前节点,完全避免野指针问题:
void BST::DeleteAll(Node* node) { if (node == nullptr) { return; } // 先删除左右子树 DeleteAll(node->left); DeleteAll(node->right); // 最后删除当前节点 std::cout << "Node deleted with value: " << node->value << std::endl; delete node; }
调用的时候直接传root即可,删除完成后建议手动把root置为nullptr避免后续误用。
额外注意点
- BST类目前没有自定义析构函数,会有内存泄漏风险,建议补充析构函数调用
DeleteAll释放整棵树内存。 - 目前你使用默认拷贝构造函数会导致浅拷贝,两个BST对象指向同一块节点内存,释放时会触发double free错误,建议要么禁用拷贝构造,要么实现深拷贝逻辑。
内容的提问来源于stack exchange,提问作者GoldSpark
相关产品推荐
相关产品推荐

