3 回答

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
根據(jù)你的問題,我覺得它和下面的問題是等價(jià)的:
std::map<T1,T2>模板類,clear成員函數(shù)的作用是什么,以及如何影響其控制的內(nèi)存
下面我來講講這一點(diǎn):
std::map<T1 key,T2 value>::clear()成員函數(shù)本身的作用是將map所有的節(jié)點(diǎn)都釋放,執(zhí)行完成之后map成為一個(gè)空映射表
由于map會(huì)釋放節(jié)點(diǎn),所以如果節(jié)點(diǎn)是對(duì)象,而非指針的時(shí)候,clear會(huì)調(diào)用對(duì)象的析構(gòu)函數(shù)
在這種情況下,map會(huì)釋放相關(guān)內(nèi)存的占用
但是如果節(jié)點(diǎn)是指針而非對(duì)象的時(shí)候,情況就比較復(fù)雜,因?yàn)閏lear不會(huì)主動(dòng)進(jìn)行釋放指針指向的內(nèi)存。這個(gè)時(shí)候需要用戶在清理map的時(shí)候進(jìn)行處理
如果指針是指向的常量地址(比如常量字符串、常量數(shù)組之類),則可以無需釋放
如果指針是指向的對(duì)象地址,而這個(gè)對(duì)象本身是全局對(duì)象或者另有程序控制它的生命周期,則也可以無需釋放
對(duì)于上面兩種情況,map的clear可以直接調(diào)用無需特別的自定義處理
但是對(duì)于指針是通過new、malloc、alloc等方式獲取的,而且僅有map獲取了持有權(quán),則需要在清理的時(shí)候,遍歷所有的節(jié)點(diǎn),執(zhí)行內(nèi)存釋放后,再調(diào)用clear
補(bǔ)充幾點(diǎn):
std::map<T1,T2>::iteator 可以像std::list<T>::iteator一樣,遍歷map的所有節(jié)點(diǎn)
作為map的key,請(qǐng)不要使用指針,因?yàn)閙ap會(huì)將指針作為類似整數(shù)一樣的處理,而不會(huì)調(diào)用相關(guān)的比較操作,另外key被清理的時(shí)候,情況和value一樣,參考上面的描述
map并非線程安全的,這點(diǎn)尤其注意 stl并沒有對(duì)map的線程安全性做任何承諾

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊
記住C++ 清理 new 關(guān)鍵的內(nèi)存 只有delete 才能釋放。
map 就是一個(gè) 模板類而已 會(huì)調(diào)用析構(gòu)函數(shù)。 你認(rèn)為它會(huì) 寫delete嗎 答案是不會(huì)的。
map 存的是對(duì)象可以釋放內(nèi)存。
但是 存的是指針 只能自己釋放。

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
clear清除了key-value鍵值對(duì)和內(nèi)容,但如果涉及到在堆上開辟內(nèi)存的話,這些內(nèi)存還要程序員手動(dòng)釋放。
- 3 回答
- 0 關(guān)注
- 3033 瀏覽
添加回答
舉報(bào)