std string記憶體洩露問題之分析解決

2021-08-15 11:28:01 字數 569 閱讀 8204

復原

在一次程式設計中,對效能進行測試發現有明顯的記憶體洩露,定位到乙個函式獲取字串賦值給乙個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標準容器及具有動態記憶體管理的類。

記憶體洩露問題

下面是乙個影象去霧的程式,主函式簡略如下,看一下下面的 有何問題。int main cvreleasecapture capture cvdestroywindow result return 0 大致說一下一些fast dahaze是乙個去霧類,負責影象處理,儲存等。程式看起來很簡單,主迴圈裡面做...

記憶體洩露問題

記憶體洩露是vc中自我認為比較難於解決的問題之一 至少現在解決起來很麻煩了 今天用boundschecker除錯了一下原來自己寫的程式,呵呵!居然提示記憶體洩露40位元組。看到了洩露的 的位置,一處new的地方,由於程式寫過很長時間了,所以想不起來了,乾脆模擬一下吧!程式中第一了乙個結構體,用於儲存...

GDI記憶體洩露問題

在windows系列上做程式設計,gdi是乙個很重要的技術點,有很多程式在執行多次後出現異常,除了眾所周知的記憶體洩露以外,gdi資源洩露也是乙個很直接的原因.今天就把我自己在程式設計中總結的一些經驗給大家分享,歡迎高手補充.1.create出來的gdi物件,一定要用deleteobject來釋放,...