【问题标题】:how to deliberately trigger a StackOverflowException without using recursion?如何在不使用递归的情况下故意触发 StackOverflowException?
【发布时间】:2023-03-17 10:09:01
【问题描述】:

有人告诉我,每个方法都有一个大小为 1mb 的堆栈。 所以我假设在一种方法中初始化 256 个整数值会导致 StackOverflowException。我在代码中尝试过,但没有抛出异常。

那么,如何在不使用递归的情况下故意触发 StackOverflowException 呢?

【问题讨论】:

  • 256 * 4 字节 = 1kb,而不是 1mb
  • 256 个整数 = 256 * 4 字节 = 1024 字节 = 1 kb,而不是 1 MB。因此,您需要 256000 个整数。而且我什至不会尝试编写包含 256000 个声明的代码。 (编辑:Marc Gravells 总是更快):)
  • 如果您只能在单个方法中使用256 * 4 字节的内存,那就太糟糕了...另一方面,它可能有助于保持方法的小! :-)

标签: c# .net recursion stack-overflow


【解决方案1】:

使用

throw new StackOverflowException ();

【讨论】:

  • +1。总是使用最简单的方法来获得你想要的结果? :)
【解决方案2】:

stackalloc 可能是最简单的方法(假设您希望 运行时 抛出错误,而不是您自己):

    unsafe void Boom()
    {
        int* data = stackalloc int[512 * 1024]; // 2MB
    }

【讨论】:

  • 在 64 位系统上使用有什么区别吗?堆栈更大吗?
【解决方案3】:

我将添加另一种方法:-)

unsafe struct FixedBufferExample
{
    public fixed byte Buffer[128 * 1024]; // This is a fixed buffer.
}

现在这个结构是 128kb :-) 如果你声明一个 FixedBufferExample 类型的局部变量(一个不使用 yield 或 async 的方法),它应该使用 128kb 的堆栈。你可以很快用完你的堆栈。

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2023-03-29
    • 2018-03-08
    • 2014-03-01
    • 2013-06-02
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多