STL string的記憶體釋放

2021-06-17 18:28:19 字數 1159 閱讀 4479

很久都沒有發原創部落格了,今天來談談自己對stl中的string類的理解。

雖然一直不是很喜歡用c++,但是經過實習和工作這段時間的鍛鍊,可能c++已經成為了我最熟練的語言了。說到c++,用到最大的東東,那就是stl了。神馬string、vector、set、map呀的,是用的最多的了。

廢話少說了,string類相比char*來說,要好用得多。自己不必要去管string的記憶體分配的問題,字串的長度問題也不要過多的操心。

隨著用string越來越多,有的時候你會發現string的記憶體管理的問題,存在記憶體暫時洩露的問題。這個記憶體洩露與我們常規說的記憶體洩露問題不一樣。它部是真的記憶體洩露,在程式結束的時候,記憶體還是會釋放掉的,但是在程式的執行過程中,記憶體被string物件占用著。比如你有個string物件儲存了乙個比較大的網頁,用完了之後,你想通過clear來**這個物件的記憶體,你這樣是做不到的。因為string的clear並不會真正**string物件分配記憶體。那要怎麼做才能做到呢?

用swap函式,你申請乙個臨時的string物件,然後用這個臨時string物件與要釋放記憶體的string物件交換記憶體,就能達到釋放記憶體的作用。比如s是我們要釋放的記憶體,那麼string().swap(s);就能釋放掉s物件的記憶體。

有的時候,你想直接操作stirng物件的資料儲存空間,那怎麼辦呢?我們知道可用data()函式獲取stirng物件的資料儲存空間的指標,雖然該指標是const,但這難不倒我們,因為我們可以const_cast。對這方面的問題,網上基本沒有什麼資料,經過我的摸索,正確直接操作string data buffer的方法是:

先呼叫resize函式,將data buffer開到一定的大小,具體多大由需求多定。注意這裡不應該用reserve函式來搞,因為reserve函式只是分配對應的空間,並沒有改變stirng的length。

呼叫data()函式,並const_cast成char *。

對轉換後得到的char *進行操作,注意不能超過第一步resize的大小,否則可能有越界的危險。

呼叫resize函式將string的長度調整為實際的長度。實際的長度應該由上一步實際的操作來決定。

假設我們第一步用的是reserve函式,會有什麼問題呢?首先可以明確的是,不會有越界的危險。但是,如果你這麼做的話,往往不會得到正確的結果。為什麼呢?因為第4步進行resize的時候,你之前對char*的操作,可能被重置為null char。

mysql記憶體釋放 MySQL記憶體不釋放

歡迎進入linux社群論壇,與200萬技術人員互動交流 進入 連線了一下,並進行了一次查詢操作 root nj 245 thu apr 24 16 38 38 2014 information schema select count from client statistics count 5 1 ...

Vector的記憶體釋放

最近跑乙個程式,結果2g記憶體用完了,結果也沒算出來,出現std bad alloc,應該是程式中某個地方記憶體空間沒有及時釋放,開始檢查程式。發現好多地方用到vector,而且有些會很大,並且只是中間結果,只是因為需要在多個地方訪問,定義為了類的成員變數,要等到這個類解析的時候才釋放空間,看來應該...

vector的記憶體釋放

1.vector 容器的記憶體自增長 與其他容器不同,其記憶體空間只會增長,不會減小。先來看看 c primer 中怎麼說 為了支援快速的隨機訪問,vector 容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當 vector 新增乙個元素時,為了滿足連續存放這個特性,都需要重...