如何增加堆栈内存?

时间:2009-05-21 07:10:14

标签: c++ recursion stack overflow

重复How to allow more memory and avoid stack overflow on lots of recursion?

我正在编写一个分支定界算法,它通过递归函数至少有10000个级别,但由于堆栈溢出错误而无法正常工作。这是我在C ++中的程序的简单实例:

void f(int k)
{
   if(k==10000) return;
   f(k+1);
} 

void main()
{
   f(1);
   return;
}

有人可以帮忙吗?

6 个答案:

答案 0 :(得分:4)

这是一个链接器问题。您需要告诉链接器增加分配给堆栈的内存量。对于不同的语言和编译器,这是不同的。它可以是命令行参数,也可以是配置文件,甚至可以在源代码中指定。

答案 1 :(得分:2)

如果您使用的是Linux(也许是Mac?),您可以使用ulimit命令。

但您可能希望研究优化算法或查看尾递归。

答案 2 :(得分:0)

任何递归算法都可以使用列表重写为非递归算法。这样你就可以将问题从堆栈大小转移到堆大小,堆通常比线程堆栈大很多。还有堆栈大小的链接器标志,取决于您的编译器/链接器和平台

答案 3 :(得分:0)

或者您可以将递归重写为交互。

答案 4 :(得分:0)

除了你的主要问题,你可以使用Valgrind及其工具Massif来分析你的堆栈消耗内存(默认情况下是Massif配置文件堆,但如果打开了一个选项,也可以配置堆栈)。

答案 5 :(得分:0)

如果使用_beginthreadex,则可以指定堆栈大小。我相信默认值是1MB。您可以分离一个新线程来完成您的工作,并指定您想要的任何堆栈大小。