冥界3大法王 发表于 2021-5-22 11:41

求一个delphi堆栈溢出的实现源码

RT,谢谢。

lorzl 发表于 2021-5-22 14:06

啥是堆栈溢出源码,楼下解答一下

大侠在路上 发表于 2021-5-22 14:56

路过随手回答一下,不是搞delphi的。

**堆栈**是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为**后进先出(LIFO)**队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。

**堆栈溢出**的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。**堆栈溢出**很可能由无限递归(Infinite recursion)产生,但也可能仅仅是过多的堆栈层级。

找了个delphi的递归给楼主参考一下,据我的经验,**只需要干掉递归出口**(去掉`if i<10 then`的语句),就能实现堆栈溢出了。其他部分需要楼主自行研究了。
```delphi
{递归调用的简单示例}
procedure alert(i: Integer = 1);
begin
ShowMessage(IntToStr(i)); {这是方法的功能}
Inc(i);

if i<10 then
    alert(i);               {这是方法自调用}
end;


{测试}
procedure TForm1.Button1Click(Sender: TObject);
begin
alert; {会连续弹出 9 个对话框, 分别提示 1..9}
end;
```

Cool_Breeze 发表于 2021-5-28 10:54

本帖最后由 Cool_Breeze 于 2021-5-28 11:30 编辑

C# 数组维度超过了支持的范围。
using System;
using System.Collections;

class Program
{
    static void Main()
    {
      Stack infinityStack = new Stack();
      decimal count = 0;
      while (true)
      {
            count++;
            try
            {
                infinityStack.Push("ooo");               
            }
            catch (Exception e)
            {
                // count 1,6777,2161
                // System.OutOfMemoryException: 数组维度超过了支持的范围。
                // 在 System.Collections.Stack.Push(Object obj)
                // 在 Program.Main(), 167772161
                Console.WriteLine("{0}, {1}", e, count);
                break;
            }
      }
    }
}
上面搞错了
Process is terminated due to StackOverflowException.
using System;

class Program
{
    static void Main()
    {
      int count = 0;
      Add(count);
    }
   
    static int Add(int count)
    {
      return Add(count);
    }
}

using System;

class Program
{
    static void Main()
    {
      int count = 1;
      Console.WriteLine(Add(count));
    }
   
    static int Add(int count)
    {
      int status = 0;
      if (count < 50000)
      {
            // count = 15885 进程报错
            // Process is terminated due to StackOverflowException.
            Console.WriteLine(count);
            status = Add(++count);
      }
      return status+1;
    }
}
页: [1]
查看完整版本: 求一个delphi堆栈溢出的实现源码