遂上網(wǎng)搜索,引用一下別人的文章:
*** glibc detected *** free(): invalid pointer:
*** glibc detected *** malloc(): memory corruption:
*** glibc detected *** double free or corruption (out): 0x00000000005c18a0 ***
*** glibc detected *** corrupted double-linked list: 0x00000000005ab150 ***
內(nèi)存問題始終是c++程序員需要去面對的問題,這也是c++語言的門檻較高的原因之一。通常我們會犯的內(nèi)存問題大概有以下幾種:
1.內(nèi)存重復(fù)釋放,出現(xiàn)double free時(shí),通常是由于這種情況所致。
2.內(nèi)存泄露,分配的內(nèi)存忘了釋放。
3.內(nèi)存越界使用,使用了不該使用的內(nèi)存。
4.使用了無效指針。
5.空指針,對一個(gè)空指針進(jìn)行操作。
不斷調(diào)試發(fā)現(xiàn)每次發(fā)生問題的地方還不太一樣。
但大多(不是全部)似乎和一個(gè)類(姑且稱作類A)有關(guān),理由是:
1) 我發(fā)現(xiàn)這個(gè)類A沒有正常delete,于是我加了一句delete:
但,居然在delete類A的時(shí)候發(fā)生該異常。
2) 于是我把new A的語句提前,放在另一個(gè)類B構(gòu)造函數(shù)里,然后僅在類B的析構(gòu)函數(shù)里delete。
但,發(fā)生該異常的錯誤居然提前到類B構(gòu)造函數(shù)之后的另一個(gè)類C的new的地方。
3)其他莫名其妙出錯的地方都發(fā)生在new類A的之后。
因?yàn)檫@個(gè)類A是屬于一個(gè)動態(tài)庫里的,我第一時(shí)間懷疑是不是頭文件和庫文件不一致導(dǎo)致的。因?yàn)檫@個(gè)類A在其他工程里運(yùn)行良好。
于是從其他工程里復(fù)制其頭文件,覆蓋本工程。
重新編譯工程,運(yùn)行,再也不出錯了。
因?yàn)榘l(fā)生這個(gè)錯誤情況,網(wǎng)上大多把錯誤原因歸咎于內(nèi)存泄露,所以我覺得有必要記錄一下我這個(gè)解決辦法。