這個事情其實已經(jīng)過去有幾個月颠蕴,但是覺得現(xiàn)在很想還是覺得很神奇就記錄下哨免。
事情是這樣,項目是C++開發(fā)的摊腋,沿用的另一個平臺的內(nèi)容作了移動端適配就是用到了IOS上,所以可以理解為我對這些代碼很不熟婉宰,畢竟幾百萬行的代碼都每個邏輯都清楚的大概整個公司也沒幾個歌豺。某個運行xcode時發(fā)現(xiàn)崩潰,而且每次崩潰的代碼地方都不一樣心包。崩潰提示倒是都差不多类咧,類似error for object 0x6100004459d0: pointer being freed was not allocated這個。以為多年C++經(jīng)驗當然可以一眼看出蟹腾,這是C++里最經(jīng)常出現(xiàn)的內(nèi)存錯誤doublefree了痕惋。可是每次都崩在不一樣的地方娃殖,要找到是哪個對象出了問題還真是很困難值戳。
百度之后發(fā)現(xiàn)了malloc_history這個命令,可以列出某個地址的malloc歷史炉爆,通過分析終于發(fā)現(xiàn)原因堕虹。說來也是蠻搞笑的,居然是因為有個vecotor對象需要做序列化芬首,然后寫這段代碼的人居然直接傳了vector這個對象的內(nèi)存拷貝進去赴捞。然后再另一個地方在將這段數(shù)據(jù)讀出來后直接強轉(zhuǎn)。仔細想想郁稍,vector是一個類似數(shù)組的東西赦政,那么在它的實現(xiàn)中必然會有一個成員屬性指向一片內(nèi)存用來說明對象存放的地址。由于這個vector對象是一個棧對象耀怜,在序列化之后肯定就釋放了恢着,那么那片用來存放對象的內(nèi)容也必然釋放了。但是在另一個地方反序列的時候再次釋放的時候必然就會導致double free了财破。