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()と、未定義の動作が発生するため、これを行った後はプログラムについて何も信頼できません。

キューが破損している可能性があり、 size() を -1 と報告することは、未定義の動作を呼び出した場合と同様に正しい/良い/悪いです。

于 2013-05-28T13:27:30.437 に答える
2

空のキューからポップするのは未定義の動作です。

未定義の動作には、ハードドライブのフォーマット (可能性は低い)、鼻から悪魔を出現させる (可能性は低い)、期待どおりの動作をする (可能性が高く、非常に心配) など、多くのことが含まれます。

また、 size_t を使用して印刷している%dため、問題が発生するだけです。%zu(gcc/clangで)または%IuVisual Studioで使用してみてください

于 2013-05-28T13:27:53.053 に答える
2

少し調整したSTL のキューからの予期しない動作によると。

std::queue は別のコンテナーの非常に薄いアダプター (つまりラッパー) です。報告している動作は、実際には std::deque の動作であり、デフォルトのコンテナーを変更しないため、std::queue ではありません。

空のシーケンスでpop() を呼び出すと、未定義の動作になります。

于 2013-05-28T13:28:28.440 に答える