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

C++ SortedList调用apply方法触发valgrind间接内存丢失问题求解

问题原因

内存泄漏的核心问题出在SortedList的赋值运算符operator=实现错误:
你在处理赋值逻辑时,没有提前释放当前对象已持有的节点内存,直接将head指针置为nullptr,导致原链表的所有节点资源完全丢失,无法被后续释放逻辑处理,valgrind报的间接内存丢失就是由此产生。

修复方案

修改operator=的实现,先清理当前对象的旧资源,再执行复制逻辑:

template<class T>
SortedList<T>& SortedList<T>::operator=(const SortedList &to_assign){
    if (this == &to_assign){
        return *this;
    }
    // 先释放当前对象的旧节点,避免内存泄漏
    deleteNodes(); 

    Node<T>* current_to_assign = to_assign.head;
    Node<T>* current;
    Node<T>* new_head = nullptr;

    if (current_to_assign){
        Node<T>* first_node = new Node<T>(current_to_assign->info);
        current = first_node;
        current_to_assign = current_to_assign->next;
        new_head = first_node;
    }else{
        head = nullptr;
        list_length = 0;
        return *this;
    }

    while (current_to_assign){
        Node<T>* new_node = new Node<T>(current_to_assign->info);
        current->next = new_node;
        current = current->next;
        current_to_assign = current_to_assign->next;
    }

    head = new_head;
    list_length = to_assign.list_length;
    return *this;
}

其他潜在问题补充

同时你可以检查remove函数的单节点删除分支:

if (list_length == 1){
    list_length--;
    delete head;
    // 缺少将head置为nullptr的逻辑,可能导致后续访问野指针
    head = nullptr;
    return;
}

原来的代码删除唯一节点后没有把head置空,后续操作链表时可能触发野指针访问。

修改后重新编译运行,内存泄漏问题就会消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 09:24:08