2011-08-21 71 views
1

我正在编写一个使用大量递归函数的C程序。我也在使用动态列表在递归时存储一些数据。我实现了Push功能来将数据推送到列表中。是内存泄漏,还是函数调用的限制,还是什么?

几个电话的推送功能“> 17000次”我收到以下错误后:

未处理的异常在0x77963c47在习题 - 盖CE.exe:0xC00000FD:堆栈溢出。
return HeapAlloc(_crtheap, 0, size ? size : 1);,在Push功能中从stack->listNode = malloc(sizeof(struct Node));调用。

我打开任务管理器,发现我仍然有很多空闲的内存。所以我猜这不是内存泄漏问题。

有多少我可以添加到列表中,或者我可以调用一个函数多少次?

+0

请张贴您的代码。谢谢。 – 2011-08-21 14:05:30

+0

你递归的程度有多深?当你太深时,你的程序堆栈将不足以处理那么多的功能框架。 – Nobody

回答

5

“> 17,000次”不是“几个”。这是血腥的负载。

你不能指望你的堆栈保存17000帧(以及它可以保存的实现是多少,也取决于每帧中有多少数据)。

改为使用迭代。

+1

我做了一些更多的调试,我发现血腥的递归是真正的问题。这将是很难使用迭代,而不是递归,因为代码是非常复杂的:(。 –

+0

@Angela::)唉! –

9

为进程分配的堆栈大小是固定的。所以即使系统有足够的内存,你可以溢出堆栈

更重要的是,你的过程本身通常有足够的内存。它只是非常小的堆栈。

+3

- >使方法迭代。这不会像递归方法一样使用堆栈。 –

2

那么,会有一些限制,例如递归只能达到为您的应用程序分配的堆栈内存。由于你得到堆栈溢出,这可能是问题所在。

有关如何修改堆栈大小的一些详细信息,请参阅Change stack size for a C++ application in Linux during compilation with GNU compiler。如果即使在堆栈很大的情况下仍无法正常工作,那么很可能需要进行一些优化以减少正在使用的内存量或限制递归。

您可以尝试将一些堆栈变量分配到堆中,而不是仅仅执行本地声明,就像第一个想法一样。如果您可以发布一些关于递归函数的代码,我们可能会提供建议。你的弊病可能的解决方案就是将你的函数从使用递归转换为使用循环。

相关问题