空堆栈上的.pop()函数



我正在为一个额外的信用项目编写一些代码,我发现了一些奇怪的东西,我想看看是否有人能解释一下以更好地理解。我有一个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::dequepop_back()成员。

std::deque<T,Allocator>::pop_back

在空容器上调用pop_back会导致未定义的行为。

答案是:未定义的行为。现在你可能会问自己,C++中什么是未定义的行为?简而言之,未定义的行为允许程序的行为是编译器方便的。从技术上讲,它允许任何行为,但在实践中,编译器只做任何方便的事情。

最新更新