【发布时间】:2021-11-10 02:38:01
【问题描述】:
我有一个 massive 递归函数,它可以根据用户输入轻松溢出系统,我想知道是否有方法可以检测您是否即将用完调用堆栈空间运行。有没有办法检查我是否要炸毁堆栈,以便我可以终止/做其他事情?
【问题讨论】:
-
在 linux 上,如果你
#include <sys/resource.h>并说struct rlimit l; getrlimit(RLIMIT_STACK, &l); std::cout << l.rlim_cur;它会给你堆栈空间。也许使用这个大小来查看用户输入是否大于这个? (我不确定是否有确定堆栈空间的标准)。或者使用带有大小限制的std::stack<>。 -
你能把函数重写为非递归的吗?您应该可以使用循环和
std::stack。 -
@Galik 我已经编写了该函数的非递归版本。这是出于学习目的。我只是想知道有没有可能。
-
@NeonFire 我目前使用的是 Windows 系统,但无论如何这都是有用的信息。谢谢!
-
在进行软件设计时,您还应该考虑要将哪些资源(内存/堆栈空间/....)分配给软件的哪些部分。所以我能想到的最简单的方法是不检测而是预防。首先考虑一下您想要“吃掉”多少堆栈内存,然后为您的递归深度设置一个最大值,并将其添加到您的递归结束条件中。如果您可以更好地预先计算递归深度,因为这样您就可以阻止递归甚至开始,将所有这些资源留给系统中的其他事物。
标签: c++ recursion stack stack-overflow