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

C++实现二叉搜索树(BST)删除全节点时内存未释放问题排查

问题1:重复值节点直接泄漏

插入逻辑中,每次循环都会先调用new BSTNode生成新节点,再通过findNode判断是否存在重复值。如果检测到重复值,已分配的新节点不会被插入树中,也不会被手动释放,直接造成内存泄漏,该问题和后续的销毁逻辑无关。

修复方案:将节点创建逻辑移到重复值判断之后,仅确认需要插入时再分配内存:

for (int i = 0; i < nodesAmount; i++) {
    value = rand() % INT_MAX + 1;
    if (!findNode(root, value)) {
        BSTNode* n = new BSTNode(value, "");
        root = (BSTNode*)insertNode(root, n, BST);
    }
}

问题2:递归销毁方法存在未定义行为

BSTNode::destroy方法的空指针校验逻辑无效。C++中使用空指针调用非静态成员函数本身属于未定义行为,当节点的左/右子节点为空时,直接调用left->destroy()或right->destroy()会触发未定义行为,递归逻辑无法正常执行完成,导致大量节点未被释放。

修复方案:调整递归逻辑,先判断子节点非空再调用销毁方法:

void BSTNode::destroy(){
    if (left != nullptr) {
        left->destroy();
    }
    if (right != nullptr) {
        right->destroy();
    }
    delete this;
}

同时调用销毁方法前先校验根节点非空:

if (root != nullptr) {
    root->destroy();
    root = nullptr;
}

补充说明

第二种基于栈实现的迭代式销毁逻辑本身没有错误,修复上述重复值泄漏的问题后,该方案可以正常释放所有节点内存。

内容的提问来源于stack exchange,提问作者Simone B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 12:15:05