最近在代碼中用了這樣一個DLL,採用靜態加載方式使用,原型相似以下:函數
XXX_API int xx_func(std::vector<struct xx> &xx_tbl, ..., ...);//代碼中會用xx_tbl.push_back(xx);之類的代碼向xx_tbl裏面填充數據
可是卻出現一個奇葩問題,每當調用這個DLL的程序退出時Debug版本有很大機率會崩潰在這個std::vector<struct xx>的析構函數上。spa
研究了很久才發現,當DLL中調用push_back函數時,其實std::vector<struct xx>的構造函數分配的內存是屬於這個DLL的資源,當程序退出時會首先卸載這個DLL程序,那麼與他相關的內存也隨之被釋放。code
當主程序最後退出時,就會引起xx_tbl的析構函數,可是因爲xx_tbl中的某些元素的內存是在DLL中分配的,並且已經被釋放了,那麼這些內存在被析構函數釋放時就會引出錯誤,Debug版的代碼是有內存檢查的,所以每次Debug代碼退出時就會崩潰。對象
所以,對於DLL中儘可能採用純C的結構,不要使用對象。blog