我有一个庞大的递归函数,它可以很容易地根据用户输入溢出系统,我想知道是否有一种方法可以检测您是否即将在运行时耗尽调用堆栈空间。是否有一种方法来检查我是否要吹堆栈,以便我可以终止/做其他事情,如果我要?
在某些情况下,我们更喜欢使用递归函数。但是,如果递归函数在某些环境(例如Visual c++代码)中走得太深,可能会出现不希望看到的结果,例如堆栈溢出。与您的相同,只是我们将递归函数转换为带堆栈的while循环。你可以在这里查看实现
实际上没有通用的方法来检测系统堆栈大小,因为每个编译器都有不同的堆栈大小,其中一些是可调整的堆栈大小。
您可以按如下方式检查不同的大小:
glibc i386, x86_64: 7.4 MB
Tru64 5.1: 5.2 MB
Cygwin: 1.8 MB
Solaris 7..10: 1 MB
MacOS X 10.5: 460 KB
AIX 5: 98 KB
OpenBSD 4.0: 64 KB
HP-UX 11: 16 KB
因为它是运行时错误,所以你也不能使用try-catch
语句捕获,但你可以实现预防逻辑。
#include <stdio.h>
// These will be set at the top of main()
static char * _topOfStack;
static int _maxAllowedStackUsage;
int GetCurrentStackSize()
{
char localVar;
int curStackSize = (&localVar)-_topOfStack;
if (curStackSize < 0) curStackSize = -curStackSize; // in case the stack is growing down
return curStackSize;
}
void MyRecursiveFunction()
{
int curStackSize = GetCurrentStackSize();
printf("MyRecursiveFunction: curStackSize=%in", curStackSize);
if (curStackSize < _maxAllowedStackUsage) MyRecursiveFunction();
else
{
printf(" Can't recurse any more, the stack is too big!n");
}
}
int main(int, char **)
{
char topOfStack;
_topOfStack = &topOfStack;
_maxAllowedStackUsage = 4096; // or whatever amount you feel comfortable allowing
MyRecursiveFunction();
return 0;
}
是否有一种在运行时检测堆栈溢出的方法?(c++)
没有标准的方法来知道有多少堆栈空间可用,也没有标准的方法来知道有多少堆栈被消耗,也没有标准的方法来知道函数调用将消耗多少堆栈。
总结:没有标准的方法来检测潜在的堆栈溢出。