std::string使用錯誤導致的內存泄露分析
參考鏈接:
http://www.cppblog.com/qinqing1984/archive/2009/08/07/92479.html
復原
在一次編程中,對性能進行測試發現有明顯的內存泄露,定位到一個函數獲取字符串賦值給一個string對象,屏蔽這行,就沒有內存泄露,或者使用cout打印下這個string對象,內存也不泄露,特別詭異
解決方法
在調查後發現,這個string對象在一開始被我使用memset初始化爲0,然後導致內存泄露,將memset函數去除後,內存泄露問題解決
原因
經過一番源代碼跟蹤調試後,發現原因在於TOWER_INFO結構體的構造函數內調用了
memset(this, 0, sizeof(_TOWER_INFO);使得string內部指針_Bx._Ptrr值爲0,_Myres爲0,在這種情況下當string對象被賦值爲小字符串(字節數包括結束符小於等於16的字符串)時,因新申請的內存在後來得不到釋放,所以這塊內存被泄露了,
根據string類內存管理算法(ms vc版本)得知這塊內存大小總是16個字節.但當被賦值爲大字符串(字節數包括結束符大於16的字符串)時,反而沒有內存泄露,這是因爲新申請的內存在析構或下次賦值時總能被釋放.
總結:
不要輕易零初始化string, vector等stl標準容器及具有動態內存管理的類。