「已注销」 2023-06-16 17:43 采纳率: 33.3%
浏览 30
已结题

C++优先队列重载运算符,存入结构体指针后输出异常

如图所示

img

在写小算法,哈夫曼树编码解码。
我尝试着在建树的步骤中使用优先队列,但是在运算符重载后,我发现了一个问题。
运算符重载的是结构体类型,但是优先队列中存储的是指针,在向优先队列中添加了结点后输出权值,输出的却是地址。

随后写了个小demo实验一番,如图所示,结果更奇怪了,在存入三个指针后,输出了两个地址和一个值
这是为什么?

小demo代码


#include <iostream>
#include <queue>
#include <vector>
using namespace std;

struct demo {
    int number;
    
    bool operator < (const demo &a) const {
        return number<a.number;
    }
    bool operator > (const demo &a) const {
        return number>a.number;
    }
    
    //Init
    demo() {
        number = 0;
    }
    demo(int num) {
        number = num;
    }
};

int main() {
    //优先队列 
    priority_queue<demo*, vector<demo*>, greater<demo*> > aaa;
    
    
    for(int u = 1; u<= 3; u++) {
        demo* ddd = new demo(u);
        aaa.push(ddd);
        delete ddd;
    }
    
    //输出所有 
    while(!aaa.empty()) {
        cout << aaa.top()->number << endl;aaa.pop();
    }
}

问题已解决,修改后代码为

#include <iostream>
#include <queue>
#include <vector>
using namespace std;

struct demo {
    int number;
    bool operator < (const demo &a) const {    return number<a.number;}
    bool operator > (const demo &a) const { return number>a.number;}
    //Init
    demo() { number = 0;}
    demo(int num) {    number = num;}
};

int main() {
    //优先队列 
    priority_queue<demo*, vector<demo*>, greater<demo*> > aaa;
    demo* ddd = NULL;    
    for(int u = 1; u<= 3; u++) {
        ddd = new demo(u);
        aaa.push(ddd);
    }
    
    //输出所有 
    while(!aaa.empty()) {
        cout << aaa.top()->number << " ";aaa.pop();
    }
}

  • 写回答

3条回答 默认 最新

  • 快乐鹦鹉 2023-06-16 17:50
    关注

    demo代码运行过吗?demo类的所有成员都是私有的?
    aaa.push(ddd); 这里push存储的都是指针而已,你接着delete ddd就完蛋了。vector存储的全成了野指针了啊

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月24日
  • 已采纳回答 6月16日
  • 修改了问题 6月16日
  • 创建了问题 6月16日

悬赏问题

  • ¥15 用matlab或python实现多个表格合并单元格
  • ¥15 gojs 点击按钮node的position位置进行改变,再次点击回到原来的位置
  • ¥15 计算决策面并仿真附上结果
  • ¥20 halcon 图像拼接
  • ¥15 webstorm上开发的vue3+vite5+typeScript打包时报错
  • ¥15 vue使用gojs,需求在link中的虚线上添加方向箭头
  • ¥15 CSS通配符清除内外边距为什么可以覆盖默认样式?
  • ¥15 SPSS分类模型实训题步骤
  • ¥100 求ASMedia ASM1184e & ASM1187e 芯片datasheet/规格书
  • ¥15 求解决扩散模型代码问题