You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带父指针的二叉树执行删除操作时出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:15:08