您好,登錄后才能下訂單哦!
0xC0000005: 讀取位置 0x22203A22 時發生訪問沖突
場景
網絡傳輸過來的,由于采用了qpid-cpp庫,獲取到的是request.getContent()的是string類型的數據類型,然后通過c_str函數,獲取到字符串,保存在一個char szBuffer[1024]數組內,在定義的類,調用析構函數退出導致程序崩潰
原因
通過strcpy拷貝字符串到szBuffer數組,發生了數組的越界,因為字符串的長度是1159
提醒
目前已經出現過兩次的0xC0000005崩潰信息
1 訪問一個釋放的空指針,在一個遞歸的邏輯中
2 strcpy拷貝字符串,發生數組越界
xC0000005:讀取位置oxfeeefeee時發生訪問沖突
問題
test.exe 中的 0x1021af50 (zlib.dll) 處未處理的異常: 0xC0000005: 讀取位置 0xfeeefeee 時發生訪問沖突
分析
代碼中斷于獲取list的迭代指針:
#if _HAS_ITERATOR_DEBUGGING || _SECURE_SCL
iterator begin()
{// return iterator for beginning of mutable sequence
return (iterator(_Nextnode(_Myhead), this));
}
懷疑1:是否是堆棧溢出?不可能沒有占用多少空間
懷疑2:是否迭代書寫問題?不可能在其他的程序運行良好
現象:調用堆棧的顯示區域,提示:feeefeee()
進行debug設置:調試菜單下,勾選所有的異常,在調試的模式下,重新編譯。這一次指向list迭代之前的一行代碼,這行代碼進行了字符串的拷貝,觀察賦值指針,pszName的值是0xfeeefeee:錯誤的指針。
補充知識
FEEEFEEE微軟的HeapFree函數用該值來標記被釋放了的堆內存
經過上面的知識,可以知道任何的一塊內存分配,都會在字符串中填充0xfeeefeee作為內存沒有釋放的標志,當調用函數釋放內存的時候,就會首先檢查指針的內容是否包含該標志位,如果沒有該標志位,就會出現異常中斷的情況。pszName分配的內存已經被釋放,導致了程序中斷。在項目中,采用了遞歸的算法進行了多次的搜索,在函數進行退出遞歸的時候,該指針已經指向了一個已經釋放的內存,所在在進行遞歸的過程中,將已有的內容拷貝出來,防止在遞歸的過程中被釋放,從而解決了問題。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。