我正在编写一个使用大量递归函数的C程序。我还使用动态列表来存储一些数据,同时递归。我实现了Push功能将数据推送到列表中。
在多次调用推送功能“> 17,000次”后,我收到以下错误:
Prob中0x77963c47处的未处理异常 - Cap CE.exe:0xC00000FD:堆栈溢出。
在推送功能中从return HeapAlloc(_crtheap, 0, size ? size : 1);
调用的stack->listNode = malloc(sizeof(struct Node));
处。
我打开了任务管理器,发现我还有很多可用内存。所以我猜这不是内存泄漏问题。
我可以添加到列表中的数量,或者我可以调用函数的次数有限制吗?
答案 0 :(得分:9)
为进程分配的堆栈大小是固定的。因此,即使系统有足够的内存,也可以溢出堆栈。
更重要的是,你的过程本身通常有足够的内存。这只是堆栈非常小。
答案 1 :(得分:5)
“> 17,000次”不是“几次”。这是血腥的负担。
你不能指望你的堆栈能容纳17,000个帧( 能保持多少是依赖于实现的,并且还取决于每帧中的数据量。)
改为使用迭代。
答案 2 :(得分:2)
嗯,会有限制,例如递归只能达到为你的应用分配的堆栈内存。由于你的堆栈溢出,这似乎可能是问题。
有关如何修改堆栈大小的详细信息,请参阅Change stack size for a C++ application in Linux during compilation with GNU compiler。如果即使使用大量堆栈也无法使其正常工作,那么您可能需要进行一些优化以减少正在使用的内存量,或者限制递归。
您可以尝试通过分配它们将一些堆栈变量移动到堆中而不仅仅是执行本地声明,这是第一个想法。如果您可以发布一些关于递归函数的代码,我们可能会给出建议。你的弊病的一个可能的解决方案就是将你的函数从使用递归转换为使用循环。