幫助除錯記憶體錯誤的方法一:
對已經分配或者釋放的記憶體寫入確定的位元組作為標識,以幫助暴露程式中的錯誤:
0xcd
已經分配的資料 allocated data
0xdd
已經釋放的資料 deleted data
0xfd
被保護的資料 fence data
其中保護位元組被寫入在被保護記憶體區域的開始和結束的四個位元組,以幫助檢測上溢位和下溢位。
舉例說明:
//pdata被設為0xcdcdcdcd
float *pdata = new float;
//fence1和fence2被設為0xfdfdfdfd
int fence1 = *((int*)pdata) -1;
int fence2 = *(int*)(((char*)pdata)+sizeof(float));
delete pdata;//執行後pdata被設為0xdddddddd。
(如果你沒有選中除錯堆選項中的_crtdbg_delay_free_mem_df,而且打算重新計算fence1和fence2的值,就會發現他們也被設成0xdddddddd。)
這樣做的好處
如果你發現乙個程式嘗試對乙個內容為0xcdcdcdcd或者0xdddddddd的指標位址解除引用(或者類似的標識,如0xcdcdcdf0很可能是由某個錯誤指標加上偏移),這時候一定是發現了乙個程式錯誤。
幫助除錯記憶體錯誤的方法二:
另一種方法是c執行時刻函式庫使用的記憶體塊型別識別符號。雖然前面的位元組標識法很有用,但是不能以規則的方式對它們進行檢查。
記憶體塊型別:
_nomal_block
由程式直接分配的記憶體
_client_block
由程式直接分配的記憶體,可以通過記憶體除錯函
數對其擁有特殊控制權
_crt_block
由執行時刻函式庫內部分配的記憶體
_free_block
已經被釋放,但是跟蹤仍然被保留下來的記憶體
,這在使用者選擇了除錯堆選項
_crtdbg_delay_free_mem_df以後會出現
_ignore_block
當使用_crtdbgflag關閉記憶體除錯操作以後分
配的記憶體(記憶體除錯函式不會對這些記憶體塊進
行檢查,認為它們沒有錯誤)
還要注意一點就是這些除錯函式只能在除錯版本中使用。
一些有用的記憶體除錯函式略。
使用除錯堆
一.使用條件與目的:
1.確定自己使用的是程式的除錯版本,並且鏈結的是c執行時刻函式庫的除錯版本;
2.必須定義_debug;
這樣除錯堆版本的new和delete才會被呼叫,才能檢測記憶體錯誤和記憶體洩漏。
3.選擇所需要的額外測試選項,在程式結束的時候顯示記憶體 ,正確報告源檔名和行號,並且顯示資料資訊;
二.除錯堆選項
使用者使用_crtsetdbgflag函式對除錯堆的檢查工作進行控制。
除錯堆選項略。
記憶體洩漏檢查
1.乙個指標多次進行賦值時,每次賦值後使用完後要釋放記憶體 coffsetcoedgemap poffsetcoedgemap polygonoffset ppoly,retpolygon,doffsetdis,enextend,0.1 expect true g ovldmgr.isvalid r...
記憶體洩漏檢查
關於記憶體洩漏的檢查網上有很多的例子和 其基本的方法都是用巨集,替換掉記憶體分配以及釋放的函式。但是現在網上很多的例子中沒有乙個是適合我們公司的需求的。具體的對記憶體洩漏檢查有如下要求 1.記憶體洩漏檢查的 盡可能少的占用cpu及記憶體 2.盡可能的不影響原程式 因為,我們的伺服器程式有洩漏而且是特...
SPDisposeCheck記憶體洩漏檢查工具的使用
spdisposecheck是開發sharepoint專案必不可少的工具之一,用它可以檢測出我們寫的 是否正確銷毀掉諸如spsite或者spweb之類的 資源消耗大戶 你開啟乙個spsite或者spweb物件 將占用1m到2m的記憶體,如果你不斷開啟此類物件並沒有及時關閉,那麼你的記憶體就會很快被消...