2013-05-28 22 views
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; 
} 
+11

可能是因爲彈出空容器會調用未定義的行爲。 –

+2

如果您修復了程序中的錯誤,那麼一切都將回到合理的位置。 (IOW「爲什麼它是我的越野車程序不正確?」是一個很差的問題) –

+0

..和-1返回是一個很好的線索,該方法是抱怨它。 –

回答

3

在空容器上調用queue.pop()會產生未定義的行爲,因此在完成此操作後,您無法真正依賴於有關程序的任何內容。

當您調用未定義的行爲時,讓您的隊列可能受損並報告大小(-1)爲正確/好/不好。

2

這是未定義的行爲從空隊列中彈出。

未定義behavoir可以包括很多事情,例如格式化你的硬盤(不太可能!),使惡魔從你的鼻子出現(也不可能),或有時做的正是你所期望的(可能和非常令人擔憂)

你還打印一個size_t使用%d這隻會導致麻煩。嘗試在Visual Studio上使用%zu(在gcc/clang上)或%Iu對視覺工作室

2

根據Unexpected behavior from STL's queue稍微調整。

的std ::隊列是一個非常薄的適配器(即包裝)圍繞另一個容器,您所舉報的行爲實際上是性病的行爲:: deque的,沒有標準::隊列,因爲你不改變默認容器。

在空序列上調用pop()是未定義的行爲。