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

C++哈夫曼编码实现中向指针优先队列push指针触发valgrind错误

问题根因

你的priority_queue存储的元素类型是Node*(Node指针),但自定义比较器nodeCompare的operator()接收的参数是Node const&(Node常量引用),二者类型完全不匹配。
优先队列在执行堆调整的比较逻辑时,会直接把存储的Node*指针作为参数传入比较器,程序会把指针的地址值强行解释为Node对象的内存地址进行非法访问,这就是valgrind报未初始化值错误的直接原因。

修复方案

调整nodeCompare比较器的参数类型为Node const*,解引用指针访问频率即可:

struct nodeCompare{
  bool operator()(Node const* n1, Node const* n2){
    return n1->getFreq() > n2->getFreq();
  }
};

原有比较逻辑的大小关系不需要调整,你写的n1频率 > n2频率返回true刚好适配优先队列的规则,能得到哈夫曼编码需要的小顶堆,每次取到频率最低的节点。

额外注意事项

你当前所有Node对象都是通过new动态分配的,后续需要在HuffmanCode类的析构函数中递归遍历哈夫曼树释放所有节点内存,否则valgrind会报内存泄漏错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:27:01