【问题标题】:How many functions to create a stackoverflow?创建一个stackoverflow有多少个函数?
【发布时间】:2012-02-28 02:11:44
【问题描述】:

在使用 Visual C++ 和 2GB RAM 的 Windows XP 上,必须同时在堆栈上创建多少个函数才能创建 stackoverflow? (即在递归函数中)

有没有一种简单的方法可以计算出其他类似情况?

【问题讨论】:

  • 栈默认为1MB。在优化的构建中,最小的可能堆栈帧是 4 个字节。实用的要大得多。 RAM 与它无关。
  • 我可以在一个函数调用中溢出堆栈。

标签: c++ windows memory windows-xp stack-overflow


【解决方案1】:

仅从编译器无法得知。堆栈溢出是由于堆栈溢出而发生的。堆栈的大小取决于函数采用的参数、函数使用的局部变量和编译器优化。我相信甚至有一些 C99 函数会直接从堆栈中分配空间。

堆栈大小的限制由 编译器 开关决定,而不是您的计算机中有多少 RAM。因此,溢出调用多少次与编译器设置有关,而不是与您的内存有关。

这不是你可以先验确定的。至少,不是微不足道的。

【讨论】:

  • 实际上,可以通过查看 PE Optional Header 中的 SizeOfStackCommit 字段(偏移量 72)来确定图像在运行时的堆栈限制。正如汉斯所说,通常是0x10000(1MB)。
【解决方案2】:

您可以尝试无限递归。它是堆栈溢出的常见原因之一。

int f() { g(); } int g() { f(); }

【讨论】:

  • 这不能回答问题。 - 此外,我预计它会在不到 5 秒的时间内产生堆栈溢出,但它却超时了:ideone.com/QoWtS ;)
猜你喜欢
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 2012-06-25
  • 1970-01-01
相关资源
最近更新 更多