std::priority_queue自定义排序实现报错,请求排查及修复指导
问题分析与修复方案
错误原因
你的代码存在两个核心问题:
- priority_queue声明语法错误:第24行的
std::priority_queue AContainer(A*, std::vector<A*>, Compare);会被编译器误判为函数声明(试图声明一个返回std::priority_queue类型、名为AContainer的函数),但std::priority_queue是模板类,必须用尖括号<>传递模板参数,而非圆括号()——这正是编译器报错的根源。 - 循环条件逻辑错误:
while (AContainer.size() < 0)的条件永远不成立,因为size()返回无符号整数,最小值为0,导致循环完全不执行,队列中的A对象永远不会被释放,造成内存泄漏。
修复步骤
- 修正priority_queue的声明:将圆括号替换为尖括号,正确传递模板参数:
std::priority_queue<A*, std::vector<A*>, Compare> AContainer; - 修正循环条件:使用
!AContainer.empty()或者AContainer.size() > 0(推荐前者,效率更高):while (!AContainer.empty()) { // ... }
修复后的完整代码
#include <iostream> #include <queue> #include <vector> class A { public: int num; A(int n) : num(n) {} // 改用初始化列表,写法更规范 ~A() { std::cout << "Deleting an A\n"; } }; struct Compare { bool operator()(const A* first, const A* second) { // 注:当前逻辑会让num大的元素优先出队(大顶堆) // 若需要小顶堆,可改为 return first->num > second->num; return first->num < second->num; } }; int main() { std::priority_queue<A*, std::vector<A*>, Compare> AContainer; AContainer.push(new A(4)); AContainer.push(new A(8)); AContainer.push(new A(6)); while (!AContainer.empty()) { A* del = AContainer.top(); delete del; del = nullptr; AContainer.pop(); } return 0; }
额外优化提示
如果不想手动管理原始指针的内存,建议改用std::unique_ptr<A>,从根源避免内存泄漏:
#include <memory> // 需要包含头文件 // 声明队列 std::priority_queue<std::unique_ptr<A>, std::vector<std::unique_ptr<A>>, Compare> AContainer; // 入队 AContainer.push(std::make_unique<A>(4)); // 出队无需手动delete while (!AContainer.empty()) { AContainer.pop(); // unique_ptr会自动释放内存 }
内容的提问来源于stack exchange,提问作者farnz
相关产品推荐
相关产品推荐

