你能举一个C ++中的堆栈溢出的例子吗?

时间:2009-11-01 15:52:15

标签: c++ debugging visual-c++ g++ stack-overflow

您能举一个C ++中的堆栈溢出示例吗?除递归案例外:

void foo() { foo(); }

12 个答案:

答案 0 :(得分:17)

不涉及无限递归的典型情况是在堆栈上声明一个太大的自动变量。例如:

int foo()
{
    int array[1000000];

}

答案 1 :(得分:11)

请参阅Stack overflow - Wikipedia。我已直接链接到示例部分。

答案 2 :(得分:6)

void function()
{
 function();
}

答案 3 :(得分:5)

这是实践中可能发生的事情:

int factorial(int x) {
  return x == 0 ? 1 : x * factorial(x-1);
}

这会使负数x溢出。而as Frank Krueger mentioned,也是x太大(但int会先溢出)。

答案 4 :(得分:3)

继续尝试返回main,直到堆栈耗尽?

int main(int argc, char **argv)
{
    return main(argc, argv);
}

答案 5 :(得分:3)

根据编辑: - )

void ping()
{
  pong();
}

void pong()
{
ping();
}

另外,如果你试图分配比最大线程堆栈大小更多的空间(默认情况下在VS中为1MB),我相信你可以获得堆栈溢出,所以像int a[100000];这样的东西应该提供异常。

答案 6 :(得分:3)

编译时示例:

template <int N>
struct Factorial {
    enum { value = N * Factorial<N - 1>::value };
};

// ...
{
    int overflow = Factorial<10>::value;
}

答案 7 :(得分:2)

我无法相信我们中断了有史以来最伟大的递归例子,因子!

#include <stdio.h>

double fact(double n) {
    if (n <= 0) return 1;
    else return n * fact(n - 1);
}

int main() {
    printf("fact(5) = %g\n", fact(5));
    printf("fact(10) = %g\n", fact(10));
    printf("fact(100) = %g\n", fact(100));
    printf("fact(1000) = %g\n", fact(1000));
    printf("fact(1000000) = %g\n", fact(1000000));
}

在OS X 10.5.8上使用GCC 4.0.1:

$ gcc f.c -o f && ./f
fact(5) = 120
fact(10) = 3.6288e+06
fact(100) = 9.33262e+157
fact(1000) = inf
Segmentation fault

不幸的是,OS X报告“分段错误”而不是“堆栈溢出”。太糟糕了。

答案 8 :(得分:1)

此示例显示不受控制的递归。最终,分配给此进程的堆栈空间将被bar和ret实例完全覆盖...

int foo( int bar )
{
    int ret = foo( 42 );
    return ret;
}

答案 9 :(得分:1)

如果你想生成一个显式非递归程序,导致函数调用导致堆栈溢出:

#!/usr/bin/env python
import sys

print "void func" + sys.argv[1] + "() { }"
for i in xrange(int(sys.argv[1])-1, -1, -1):
    print "void func" + str(i) + "() { func" + str(i+1) + "(); }"
print "int main() { func0(); return 0; }"

示例输出:

$ python recursion.py 5
void func5() { }
void func4() { func5(); }
void func3() { func4(); }
void func2() { func3(); }
void func1() { func2(); }
void func0() { func1(); }
int main() { func0(); return 0; }

样本用法:

$ python recursion.py 250000 | g++ -x c++ - && ./a.out

至少在我的系统上,调用堆栈似乎是174602,所以你需要将recursion.py的参数设置为大于那个;编译和链接程序需要几分钟时间。

答案 10 :(得分:0)

无限递归:

void infiniteFunction()
{
    infiniteFunction();
}

int main()
{
    infiniteFunction();
    return 0;
}

答案 11 :(得分:0)

如果尝试将大对象放在堆栈上(按值),也可能会出现堆栈溢出。