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

