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
相关产品推荐
相关产品推荐

