0
#include <queue>
#include <stdio.h>

int main ()
{
    std::queue<int> q;
    printf("%d\n", q.size());

    q.pop();
    q.pop();

    printf("%d\n", q.size());  // ===> prints -2

    return 0;
}
4

3 回答 3

3

调用queue.pop()空容器会产生未定义的行为,因此在完成此操作后,您将无法真正依赖程序的任何内容。

当您调用未定义的行为时,让您的队列可能损坏并报告 -1 的 size() 是正确的/好/坏的。

于 2013-05-28T13:27:30.437 回答
2

从空队列中弹出是未定义的行为。

未定义的行为可能包括许多事情,例如格式化您的硬盘驱动器(不太可能!),让恶魔从您的鼻子出现(也不太可能)或有时完全按照您的预期行事(可能而且非常令人担忧)

您还使用 size_t 打印%d只会导致麻烦。尝试使用%zu(在 gcc/clang%Iu上)或 Visual Studio

于 2013-05-28T13:27:53.053 回答
2

根据STL 队列中的意外行为,稍作调整。

std::queue 是另一个容器周围的一个非常薄的适配器(即包装器),您报告的行为实际上是 std::deque 的行为,而不是 std::queue 的行为,因为您没有更改默认容器。

在空序列上调用 pop()未定义的行为。

于 2013-05-28T13:28:28.440 回答