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

C++空队列调用back()仍返回成员值问题咨询

为什么队列pop()后调用back()仍能获取到值?

我将employee结构体创建对象并推入queue,执行pop()后队列应为空,但调用back()获取salary等成员仍能得到对应值,这是为什么?

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

struct employee {
    string name;
    int age;
    int salary;
};

int main() {

    queue<employee> q;
    employee e {"Rio",22,1000};

    q.push(e);

    q.pop();
    cout<<q.back().salary<<endl;

    return 0;
}

原因解释

这本质上是未定义行为导致的巧合结果:

  • C++标准明确规定,当队列处于空状态(q.empty() == true)时,调用back()或front()是非法的,程序的行为没有任何保证。
  • pop()操作只是移除了队列的首元素,但底层容器(默认是deque)并不会立刻释放该元素占用的内存,原来的对象数据可能暂时还留在内存中没有被覆盖,所以你碰巧读取到了旧值。
  • 这种结果完全不可靠:换个编译器、调整编译选项或者在不同环境运行,可能会拿到垃圾值、程序直接崩溃,或者出现其他奇怪的结果。

正确做法

在调用back()或front()之前,必须先检查队列是否为空:

if (!q.empty()) {
    cout << q.back().salary << endl;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:39:51