這兩天一直遇到標題上的問題,我相信很多朋友在執行代碼的時候都會遇到這樣的問題,我在網上也找了很多的資料解決這個問題,雖然有些方法能解決,但是總覺得總結的不是很全面,這里我自己在相對全面的總結一下,如果有不對的地方還請各位看官指正。
首先要交代一下背景情況,我執行的這段代碼是別人寫的,這段時間是我一直在維護,因為平台不一樣,所以讀庫的方式不一樣,我先在liunx的環境下編譯了程序,執行都沒有問題,可以按照我接口的方式讀到數據庫的數據。但是我用vs2010的window環境下編譯的時候就出現了以下圖片的問題。
字面上翻譯過來的話就是:棧溢出了。
意思就是你分配的內存太小了,而你程序中有的數據太大,這里導致了棧溢出的情況。
於是我就在網上找資料來查詢這個問題,一搜一大堆。
其中普遍的解決方式就是在 屬性-》鏈接器-》系統-》堆棧保留大小和堆棧提交大小 中將數據增加,我這里將這兩個數值都改成了16000000。如下圖所以:
程序確實是可以運行起來了,但是我在想一個問題,一般我們程序都是使用的默認值,出現這樣的問題歸根到底的原因是什么呢?
其實還是回到我上面說到的那個問題 堆棧溢出了,vs在程序啟動的時候一般分配的堆棧大小是1M的空間,如果你的全局變量或者靜態變量有很大的值的話,這里就會出現這樣的堆棧溢出的問題。
於是我就在代碼里面找是否有較大數據的全局變量,發現了一個宏定義如下圖所示:
這個宏定義一下就是1M了,加上其他的一些定義,肯定就超過了1M,如果你是在DEBUG的情況下去調試程序的時候,你會發現連主函數都進不去,因為有全局變量在主函數執行之前就已經棧溢出了,就好像下面這種情況,斷點無效。
但是領導那邊的要求是程序必須通過命令行的方式編譯也要通過,因為客戶那邊只會操作命令行。
操作命令不難就是在有pro文件的情況下在命令行輸入qmake,生成了makefile文件,再執行nmake,生成可執行文件。那么問題來了我用這種方式也執行成功了,也生成了可執行文件exe,但是當我雙擊exe的時候程序並沒有起來,而且沒有任何打印信息,這里我想到了可能還是這個棧溢出的問題,pro文件中應該也需要設置一下上面提到的堆棧保留大小和堆棧提交大小。那么在pro文件中如何去設置這兩個量呢?
在pro文件中添加上以下兩個量就可以了:
QMAKE_CXXFLAGS += /F 16000000
QMAKE_LFLAGS += /STACK:16000000
這個設置跟vs2010上面的設置是一樣的,當然大小自己可以定的,我這里還是設置的大小為16000000。
最后總結:
其實把問題都真正弄清楚了再會看一點都不難,但是在處理的過程中感覺還是比較費勁兒的,所有的提示都是比較精准的,最后找其原因還是回到了最本質的問題,我建議的話還是盡量將全部變量的大小設置的小一點,1024*1024就有點大了,我維護的這段代碼並不是我寫的,所以我還是准從開發的意願吧。
希望這邊文章對大家還是有所幫助 謝謝!!!