#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;
}
3 に答える
3
空のコンテナーを呼び出すqueue.pop()
と、未定義の動作が発生するため、これを行った後はプログラムについて何も信頼できません。
キューが破損している可能性があり、 size() を -1 と報告することは、未定義の動作を呼び出した場合と同様に正しい/良い/悪いです。
于 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 に答える