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