1. 程式人生 > >"Expression: _CrtIsValidHeapPoint(pUserData)"錯誤分析與解決

"Expression: _CrtIsValidHeapPoint(pUserData)"錯誤分析與解決

        程式執行時報出錯誤並彈出異常彈框,"Expression: _CrtIsValidHeapPoint(pUserData)"


一頭懵,找不到具體哪行程式碼出錯誤,但是會提示出錯誤位置:

HeapValidate( _crtheap, 0, pHdr(pUserData) );
_ASSERTE(_CrtIsValidHeapPointer(pUserData));        本人分析有兩種原因導致這個錯誤:         1、記憶體釋放產生的堆疊出錯;         2、動態連結庫(DLL)問題。 解決方法:        1、記憶體不能跨模組分配和釋放,模組分配的記憶體必須由該
模組自己來釋放。比如我在DLL中分配了一個記憶體,但是在DLL中沒有釋放,最後在主程式的exe中刪除釋放的,這樣就會報出這個錯誤。需要在分配記憶體的模組中free或delete記憶體,一般都是指標記憶體或者vector集合需要釋放記憶體。
        2、動態連結庫(DLL)問題也有兩種情況           (1)連結外部lib出錯:當前是Debug模式,但工程的 屬性->配置屬性->連結器->輸入->附加依賴項 中的連結庫用的卻是Release版本的,Release的模式下也有錯用Debug連結庫的問題,修改過來。                 (2)執行庫 方式選擇不對:工程 屬性->配置屬性->C/C++->程式碼生成
->執行庫  中的選項有可能與當前的編譯方式不符。比如當前是Release模式卻選擇了“多執行緒除錯DLL (/MDd)”,相反當前是Debug模式卻選擇的是“多執行緒DLL (/MD)”。 如果專案中用到了連結庫DLL,就需要將調為“多執行緒除錯DLL (/MDd)”或者“多執行緒DLL (/MD),千萬記住,不可以使用“多執行緒(/MT)”或者“多執行緒除錯(/MTD)”,否則會報出這個錯誤。
總結:遇到問題一定要耐心的尋找問題的根源,不能盲目的除錯。