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

