当前位置:首页 > 内存 > 正文

递归堆栈内存溢出

  • 内存
  • 2024-05-22 06:33:07
  • 8786

一、vs2010stackoverflow说是堆栈溢出了,这是怎么回事具有递归代码的VS和VC程序中可能会出现堆栈溢出错误。其实代码本身并没有错误,只是系统分配的堆栈内存不满足程序的需要。
错误信息如下:
xC00000FD:Stackoverflow(parameters:0x00000001,0x00F92FEC)。
如果有此异常的处理程序,则程序可以安全地继续。
工具/材料
VS2013
方法/步骤
打开出现堆栈溢出错误的项目文件,点击运行调试按钮如下图
运行后,出现如下堆栈溢出错误窗口。点击“停止”即可停止执行。
停止执行后,将移动到发生错误的代码段,也就是堆栈所在的位置。发生溢出。
此时,当你打开堆栈调用窗口时,你可能会发现代码调用的堆栈太大,超出了系统提供的默认容量。如下,出现内存读取错误错误。
打开本项目的属性页,找到“链接”-“系统”,如下图
在栈调用大小中填写一个较大的值。例如1000000,如果不够,则增加它,应用并退出设置。
7
再次编译运行代码,堆栈溢出错误就解决了。我的结果看起来像这样。


二、堆栈溢出一般是由什么原因导致的?迭代过程中局部变量过多,迭代深度过大,这就是系统堆栈溢出的原因,尤其是频繁的列循环,肯定会出现系统堆栈溢出。

冗余堆栈过载的解决方案是尾部冗余优化。事实上,尾频与环具有相同的作用,因此环可以被认为是尾频的特殊函数。通过这种方式,编译器或解释器可以优化尾循环,使得循环本身无论调用多少次都只占用一个堆栈帧。

扩展信息:

由于重叠增加导致计算机安全问题,采取以下预防措施:-

1执行代码以遵循正确的规则。但是,这种方法仍然存在一些缺点,因为攻击者无法访问嵌入式代码,并且LinuxGCC使用可以在线索引和重用的堆栈属性。3.使用编译器的边界检查来实现缓冲区保护。这种技术避免了缓冲区溢出,完全消除了缓冲区溢出的风险,但成本较高,例如性能较低。4.检查程序指针的正确性。这意味着在使用程序之前确保光标的内容已更改。


三、递归导致内存溢出的案例和解决办法

函数的最后一步是调用另一个函数。

由于最终调用是函数的最后一步,所以不需要维护外层函数的调用框架,因为调用位置、内部变量等信息不会被内层函数重用是直接使用的。调用框架替换了外部函数的调用框架。也就是说,只保留内部函数的调用框架。

如果所有函数都是尾调用,则每次执行时可能只有一个调用帧,从而节省大量内存。

当tail调用自身时,就是递归的。

阶乘函数

您可以在此处添加调试器,以查看在使用尾递归时,始终使用本地作用域、上下文或调用框架。因此,当该值变大时,不会超过最大存储值。

斐波那契数列