昨天一個原本運行良好的工程發(fā)生了下述錯誤:
*** glibc detected *** corrupted double-linked list: 0x00000000005ab150 ***
進程崩潰,顯示底層發(fā)送了一個段錯誤信號。
/////////////////////////////////////////////////////////////////////////////////////////
遂上網(wǎng)搜索,引用一下別人的文章: *** glibc detected *** free(): invalid pointer: 內(nèi)存問題始終是c++程序員需要去面對的問題,這也是c++語言的門檻較高的原因之一。通常我們會犯的內(nèi)存問題大概有以下幾種: /////////////////////////////////////////////////////////////////////////////////////////
我檢查了工程大多數(shù)new delete以及strcat,vsprintf,memcpy, memset,
memmove等一些內(nèi)存操作函數(shù)的地方,都沒有發(fā)現(xiàn)問題。
不斷調(diào)試發(fā)現(xiàn)每次發(fā)生問題的地方還不太一樣。 但大多(不是全部)似乎和一個類(姑且稱作類A)有關,理由是: 1) 我發(fā)現(xiàn)這個類A沒有正常delete,于是我加了一句delete: 但,居然在delete類A的時候發(fā)生該異常。 2) 于是我把new A的語句提前,放在另一個類B構造函數(shù)里,然后僅在類B的析構函數(shù)里delete。 但,發(fā)生該異常的錯誤居然提前到類B構造函數(shù)之后的另一個類C的new的地方。 3)其他莫名其妙出錯的地方都發(fā)生在new類A的之后。 因為這個類A是屬于一個動態(tài)庫里的,我第一時間懷疑是不是頭文件和庫文件不一致導致的。因為這個類A在其他工程里運行良好。 于是從其他工程里復制其頭文件,覆蓋本工程。 重新編譯工程,運行,再也不出錯了。 因為發(fā)生這個錯誤情況,網(wǎng)上大多把錯誤原因歸咎于內(nèi)存泄露,所以我覺得有必要記錄一下我這個解決辦法。
|
|