std::string內存泄露問題之分析解決

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標準容器及具有動態內存管理的類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章