1. 程式人生 > >Debug Assertion Failed! Expression: _pFirstBlock == pHead

Debug Assertion Failed! Expression: _pFirstBlock == pHead

近在VS上開發C++程式時遇到了這個錯誤:

Debug Assertion Failed! Expression:_pFirstBlock == pHead

如圖:


點選Abort之後,檢視呼叫棧,發現異常在函式return時被時產生,進一步看是vector的解構函式被呼叫時產生,以前沒開發過C++專案,沒什麼經驗,這個錯誤讓我很困惑,第一,我電腦上並沒有f盤;第二,我並沒有呼叫解構函式;第三,這到底是個什麼錯誤。

第一個問題,大概是一個虛擬的分割槽吧,第二個問題,我的vector變數是在一個函式體內部宣告使用的,函式返回的時候,自動變數生命期結束,C++應該會呼叫vector的解構函式來釋放這個物件,就在這個時候發生了異常。

關於第三個問題,我在網上查了一些資料,發現大概有以下幾種情況

①混淆了 Debug和Release情況,有時Debug和Release所需要的庫是不一樣的,如果你只匯入了Release的連結庫,而沒有匯入Debug的連結庫,而編譯執行時又選擇了Debug模式,就可能出現這種問題,這時要把Debug的連結庫新增進去可能就會解決。

②可能是在一個多執行緒模組了運行了一個單執行緒庫,記憶體在dll一側被分配,在使用一側被釋放,可能導致一個記憶體管理器在分配記憶體,另一個記憶體管理器在釋放同一片記憶體區域,導致錯誤。

C++的STL是單執行緒的,我在函式內部使用了vector,這個函式在一個多執行緒的環境裡,大概就是這個錯誤產生的原因。

一個解決方式就是設定執行庫 為/MDd

工程上右鍵-》屬性-》C/C++=》所有選項

 

關於執行庫幾個引數

多執行緒(/MT)
多執行緒除錯(/MTd)
多執行緒 DLL (/MD)
多執行緒除錯 DLL (/MDd)

名字後帶d的是debug庫,名字含D是動態連結,含T是靜態連結


C 執行時庫                                         庫檔案
MultiThread(static link)MT                     libcmt.lib
Debug multiThread(static link)MTd           libcmtd.lib
MultiThread(dynamic link)MD                  msvert.lib
Debug multiThread(dynamic link) MDd      msvertd.lib 

另:使用std::string時產生這個錯誤的解決方法

http://stackoverflow.com/questions/18882760/debug-assertion-failed-expression-pfirstblock-phead