Vis*_*ddi 16 c++ compiler-construction stackunderflow
什么可以是C++中的一个简单示例,在从方法调用调用和返回的情况下导致堆栈下溢.我熟悉调用约定,即thiscall,stdcall和cdecl以及它们清理堆栈的方式.具体来说,编译器自动为我生成的代码是否会不会出现堆栈下溢?
什么情况可以让我陷入堆栈下溢的麻烦?
我不确定你是在讨论数据结构堆栈及其中的下溢问题.就stack(data structure) underflow
问题而言,这里有一个解释.
stack
是一种后进先出(LIFO)抽象数据类型和数据结构.堆栈可以将任何抽象数据类型作为元素,但其特征仅在于三个基本操作:push,pop和stack top.
该推操作增加了一个新的项目到堆栈的顶部,或初始化堆栈,如果它是空的.如果堆栈已满并且没有足够的空间来接受给定项目,则认为堆栈处于溢出状态.pop操作从堆栈顶部删除一个项目.
甲弹出要么揭示以前隐蔽项目,或导致一个空栈,但如果堆栈为空,则它进入下溢状态(这意味着不存在任何项的堆被移除).
该堆顶部的操作会从最顶层的位置的数据,并将其返回给用户,而不删除它.如果堆栈为空,则堆栈顶部操作中也可能发生相同的下溢状态.
考虑一个堆栈实现示例:
template <class Item> class Stack
{
public:
bool isEmpty() const;
size_t size() const;
Item pop();
void push(const Item& it);
private:
};
Run Code Online (Sandbox Code Playgroud)
现在考虑在此堆栈上执行以下操作.
C++ command resulting stack
------------------------------------------------
Stack<int> S;
_____ (empty stack of ints)
S.push(7);
| 7 | <-- top
-----
S.push(2);
| 2 | <-- top
| 7 |
-----
S.push(73);
|73 | <-- top
| 2 |
| 7 |
-----
S.pop();
| 2 | <-- top
| 7 | -----
S.pop();
-----
S.pop();
| 7 | <-- top
-----
S.pop();
----- (empty)
S.pop();
ERROR "stack underflow"
Run Code Online (Sandbox Code Playgroud)