A. 按键精灵的子程序单独运行正常,一调用就提示“调用栈溢出,脚本异常终止”,求高手指点
call wqm3(130,1100,320,550)
B. 如何解决VS代码调试时出现 Stack overflow
在编有递归代码的VS、VC程序中可能会引起栈溢出错误,其实代码本身并没有出错,只是系统分配的栈内存不满足程序需要。
错误提示如下:
First-chance exception at 0x00AFE289 in 边缘检测方法.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x00F92FEC).
If there is a handler for this exception, the program may be safely continued.
工具/原料
VS2013
方法/步骤
打开出现栈溢出错误的工程文件,单击下图中的调试运行按钮
运行后会弹出如下的栈溢出错误窗口,单击“break",即中断执行
中断执行后会跳转到出现错误的代码段,即引起栈溢出的地方。
此时打开栈的调用窗口可以发现代码调用的栈太大了,超过了系统默认给定的容量。
打开此工程的属性页面,找到”Link“——”System“,
在栈的调用尺寸中填写一个较大的值,比如1000000,如果还不够就再加大点,应用并退出设置。
再次编译运行代码,栈溢出错误即可以解决了。我的输出结果如下所示。
C. 栈溢出的原因及解决办法
1,什么是栈溢出?因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。2,解决方案:方法一:用栈把递归转换成非递归通常,一个函数在调用另一个函数之前,要作如下的事情:a)将实在参数,返回地址等信息传递给被调用函数保存; b)为被调用函数的局部变量分配存储区;c)将控制转移到被调函数的入口. 从被调用函数返回调用函数之前,也要做三件事情:a)保存被调函数的计算结果;b)释放被调函数的数据区;c)依照被调函数保存的返回地址将控制转移到调用函数.所有的这些,不论是变量还是地址,本质上来说都是"数据",都是保存在系统所分配的栈中的. 那么自己就可以写一个栈来存储必要的数据,以减少系统负担。 方法二:使用static对象替代nonstatic局部对象在递归函数设计中,可以使用static对象替代nonstatic局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放nonstatic对象的开销,而且static对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。 方法三:增大堆栈大小值当创建一个线程的堆栈时,系统将会保留一个链接程序的/STACK开关指明的地址空间区域。但是,当调用CreateThread或_beginthreadex函数时,可以重载原先提交的内存数量。这两个函数都有一个参数,可以用来重载原先提交给堆栈的地址空间的内存数量。如果设定这个参数为0,那么系统将使用/STACK开关指明的已提交的堆栈大小值。后面将假定我们使用默认的堆栈大小值,即1MB的保留区域,每次提交一个页面的内存。 Java在创建线程时设置栈大小:thread(threadgroup group, runnable target, string name, long stacksize)
分配新的 thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小
D. win10打开网页就提示堆栈溢出怎么解决
电脑中无法打开网页并提示堆栈溢出的原因分析及解决方法 1、函数调用层次过深,每调用一次,函数的参数、局部变量等信息就压一次栈; 2、局部静态变量体积太大。 解决方法: 1、按win+r打开运行,输入cmd,并按回车; 2、打开命令提示符后,分别输入并执行以下命令: regsvr32 atl.dll regsvr32 shdocvw.dll regsvr32 urlmon.dll regsvr32 browseui.dll regsvr32 oleaut32.dll regsvr32 shell32.dll regsvr32 jscript.dll regsvr32 vbscript.dll regsvr32 mshtmled.dll regsvr32 CLBCATQ.DLL regsvr32 cscui.dll regsvr32 MLANG.dll regsvr32 stobject.dll regsvr32 WINHTTP.dll regsvr32 msxml3.dll regsvr32 query.dll regsvr32 jscript9.dll regsvr32 hlink.dll