Debug時,記憶體裡怎麼都是「燙燙燙燙燙燙」

2021-04-12 12:28:55 字數 751 閱讀 2177

在 debug 模式下會自動加上 /gz 編譯選項,它可以幫助捕獲記憶體錯誤。

/gz 選項會做以下這些事

(1) 初始化記憶體和變數。包括用 0xcc 初始化所有自動變數,0xcd ( cleared data ) 初始化堆中分配的記憶體(即動態分配的記憶體,例如 new ),0xdd ( dead data ) 填充已被釋放的堆記憶體(例如 delete ),0xfd( defencde data ) 初始化受保護的記憶體(debug 版在動態分配記憶體的前後加入保護記憶體以防止越界訪問),其中括號中的詞是微軟建議的助記詞。這樣做的好處是這些值都很大,作為指標是不可能的(而且 32 位系統中指標很少是奇數值,在有些系統中奇數的指標會產生執行時錯誤),作為數值也很少遇到,而且這些值也很容易辨認,因此這很有利於在 debug 版中發現 release 版才會遇到的錯誤。要特別注意的是,很多人認為編譯器會用 0 來初始化變數,這是錯誤的(而且這樣很不利於查詢錯誤)。

(2) 通過函式指標呼叫函式時,會通過檢查棧指標驗證函式呼叫的匹配性。(防止原形不匹配)

(3) 函式返回前檢查棧指標,確認未被修改。(防止越界訪問和原形不匹配,與第二項合在一起可大致模擬幀指標省略fpo)

「燙」字的mbcs編碼為「cccc」,而用 /gz 選項對自動變數會用「0xcc」初始化,連續的「0xcc」將被誤讀成「燙」字元。

cc是int 3h的機器碼,這是乙個中斷指令.debug版本的記憶體中填充這個指令就是讓程式出現錯誤的時候(非法跳轉)能停下來.方便除錯

cdcd 為「屯」字元    dddd 為「葺」字元

堆與棧在記憶體裡是怎麼分配的?

對於初學程式設計的人員來說,變數在記憶體中是分配在堆中還是在棧中,往往不甚明白,今天我來清晰簡單的講解下。當我們看到乙個變數型別是已知的,就分配在棧裡面,比如int,double等。其他未知的型別,比如自定義的型別,因為系統不知道需要多大,所以程式自己申請,這樣就分配在堆裡面。值型別與引用型別的分配...

如何解決PHP裡大量資料迴圈時記憶體耗盡的問題

最近在開發乙個php程式時遇到了下面的錯誤 php fatal error allowed memory size of 268 435 456 bytes exhausted 錯誤資訊顯示允許的最大記憶體已經耗盡。遇到這樣的錯誤起初讓我很詫異,但轉眼一想,也不奇怪,因為我正在開發的這個程式是要用乙...

如何解決PHP裡大量資料迴圈時記憶體耗盡的問題

最近在開發乙個php程式時遇到了下面的錯誤 php fatal error allowed memory size of 268 435456 bytes exhausted 錯誤資訊顯示允許的最大記憶體已經耗盡。遇到這樣的錯誤起初讓我很詫異,但轉眼一想,也不奇怪,因為我正在開發的這個程式是要用乙個...