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

C++ 2D激光雷达ICP算法内存泄漏问题求助

C++ 2D激光雷达ICP算法内存泄漏排查与修复

问题描述

在实现C++ 2D激光雷达迭代最近点(ICP)算法时出现内存泄漏,程序持续运行时内存占用不断上升。可疑代码涉及Kdnode类的嵌套指针结构,尝试了自定义析构函数但无效,析构函数代码如下:

~Kdnode() {
        if (this->left){
            this->left->~Kdnode();
            delete this->left;
            this->left = NULL;
        }
        if (this->right){
            this->right->~Kdnode();
            delete this->right;
            this->right = NULL;
        }
    }

问题分析

你的析构函数存在两个关键问题:

  • 重复析构导致未定义行为:delete操作会自动调用对象的析构函数,手动调用this->left->~Kdnode()后再执行delete this->left,会让同一个对象被析构两次,不仅无法解决泄漏,还可能掩盖真正的内存问题。
  • 根节点释放逻辑缺失:如果Kd树的根节点本身没有被正确delete,即便子节点析构逻辑正确,整棵树的内存也无法完全释放。

修复方案

1. 修正析构函数逻辑

删除手动调用析构函数的代码,仅保留delete操作,利用delete自动触发递归析构的特性完成子树内存释放:

~Kdnode() {
    delete left;   // delete会自动调用left的析构函数,递归释放左子树
    delete right;  // 同理释放右子树
    left = nullptr;
    right = nullptr;
}

注:delete nullptr是安全操作,无需额外判空,简化代码的同时避免逻辑遗漏。

2. 确保根节点被正确释放

在Kd树使用完毕后,必须手动delete根节点指针,例如:

// 假设root是Kdnode*类型的根节点指针
delete root;
root = nullptr;

3. 排查其他内存分配点

  • 检查Kdnode类中是否存在其他动态分配的成员(如点云数据指针、动态数组),确保这些资源在析构函数中同步释放。
  • 如果使用new[]分配数组,必须对应使用delete[]释放,避免数组内存泄漏。

4. 工具辅助定位

可以使用Valgrind(Linux)或Visual Studio内存诊断工具(Windows)扫描程序,精准定位未被释放的内存块,确认是否存在遗漏的分配场景。

内容的提问来源于stack exchange,提问作者MobileRobotics

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:44:57