我正在为一个额外的信用项目编写一些代码,我发现了一些奇怪的东西,我想看看是否有人能解释一下以更好地理解。我有一个for循环,它填充一个std::堆栈,然后另一个循环在填充堆栈的相同时间内弹出堆栈。我想知道如果在堆栈本身已经为空的情况下尝试pop((会发生什么。
如果使用默认的std::stack
容器std::deque
,在空堆栈上调用pop()
将调用未定义的行为。
"未定义行为";意味着您的程序的行为不能再以任何方式依赖。
下面是一个文档跟踪。您正在询问std::stack::pop()
在特定情况下的行为。因此,从该函数的文档开始。
std::stack<T,Container>::pop
有效地调用
c.pop_back()
不清楚c
的含义,但页面下方提到了Container::pop_back
,因此可以合理地推断这是下一个要查找的内容。(请注意,Container
是第二个模板参数。(如果您没有为stack
指定第二个模版参数,您可能会遇到困难。在这种情况下,请备份到std::stack
的文档以查看默认值
std::stack
默认情况下,如果没有为特定堆栈类实例化指定容器类,则使用标准容器
std::deque
。
啊哈!因此,我们需要查找std::deque
的pop_back()
成员。
std::deque<T,Allocator>::pop_back
在空容器上调用
pop_back
会导致未定义的行为。
答案是:未定义的行为。现在你可能会问自己,C++中什么是未定义的行为?简而言之,未定义的行为允许程序的行为是编译器方便的。从技术上讲,它允许任何行为,但在实践中,编译器只做任何方便的事情。