学习C++:C++中的Stack下溢示例

Vis*_*ddi 16 c++ compiler-construction stackunderflow

什么可以是C++中的一个简单示例,在从方法调用调用和返回的情况下导致堆栈下溢.我熟悉调用约定,即thiscall,stdcall和cdecl以及它们清理堆栈的方式.具体来说,编译器自动为我生成的代码是否会不会出现堆栈下溢?

什么情况可以让我陷入堆栈下溢的麻烦?

Sea*_*ean 12

我可以看到实际发生的唯一方法是,如果你声明一个函数使用stdcall(或任何其他调用约定,指定被调用者清理堆栈),然后通过指定为cdecl(或任何指定的函数指针)调用该函数调用者清理堆栈的其他调用约定.如果你这样做,被调用的函数将在返回之前弹出堆栈,然后调用者也会弹出堆栈导致下溢和可怕的事情.

在成员函数的特定情况下,调用约定通常被称为,thiscall调用者或被调用者是否清除堆栈取决于编译器.

这里的调用约定的详细信息.

  • @Sean 我想这不是真的……有趣! (2认同)

Alo*_*ave 5

我不确定你是在讨论数据结构堆栈及其中的下溢问题.就stack(data structure) underflow问题而言,这里有一个解释.

stack是一种后进先出(LIFO)抽象数据类型和数据结构.堆栈可以将任何抽象数据类型作为元素,但其特征仅在于三个基本操作:push,popstack 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)