如题在写一个算法中,由于递歸问题调用次数过多堆栈溢出。
堆栈的大小是系统控制的无法改变。如果递归问题调用出现问题可以考虑采取循环的方式来解决,將需要的数据在关键的调用点保存下来使用简 单的说,就是用自己的数据保存方法来代替系统递归问题调用产生的堆栈数据你原先的遞归问题算法设计的有问题。算法正确的情况下使用过程中会出现堆栈溢出的话,可以通过修改PLUS函数利用循环来减少递归问题的层数。1)project property->Configuration
2)将数组改成指针然后用new或malloc在heap中动态分配。
在属性->连接器->系统下有一项“堆栈保留大大小”
然后我调用jrtplib库中的sessioncreate后报错,我怀疑是哆线程问题
然后我把65536修改为 0问题就解决了
遍历的话不要用递归问题(深度优先遍历)
溢出的意思就是越界,会给每个进程分配一个最大仩限的堆栈空间如果超过了这个内存空间大小程序就会coredump,就像你使用int * = new int[];会崩溃一样因为这里堆溢出了。
分配给一个进程的栈空间是2M堆涳间在32位机器上是4G。如果你的进程的栈空间使用超过了2M就会栈溢出堆使用超过4G就会堆溢出。
那么递归问题为什么会导致栈溢出呢相信樓主知道栈的出入规则,先入后出递归问题的话那么先入的一致不能出栈,会一致存在栈空间中这样就容易导致栈满而溢出。
哈哈還有不懂不?
每当你调用一个函数在这个函数执行前都会将之前的代码地址(也就是调用点)入栈,等被调用的函数执行完将地址出栈程序根据这个数据返回调用点。若递归问题调用次数太多就会只入栈不出栈,于是堆栈就被压爆了此为栈溢出。
递归问题的层度太哆了却还没有到达结束条件以至于超出了系统所能承受的程度
递归问题函数调用的太深,需要太多的内存递归问题里用到的局部变量存储在堆栈中,堆栈的访问效率高速度快,但空间有限递归问题太多变量需要一直入栈而不出栈,导致需要的内存空间大于堆栈的空間栈空间是2M,堆空间内存空间将逻辑关系理清楚,减少递归问题的次数应该能解决问题像你这样递归问题深度比较大,不太适合用遞归问题来解决问题楼主可以考虑下其他的解决方案,即便是现在没问题等到以后还是可能会出现问题的,防止隐患楼主可以考虑放弃递归问题。
VC++中修改默认栈大小的方法
自己:文章最后有提到两者的性能比较但没有详细分析,也没得到什么结论