vector內存怎麼釋放

VECTOR的工作原理是系統預先分配一塊CAPACITY大小的空間,當插入的數據超過這個空間的時候,這塊空間會讓某種方式擴展,但是你刪除數據的時候,它卻不會縮小。
vector爲了防止大量分配連續內存的開銷,
保持一塊默認的尺寸的內存,clear只是清數據了
未清內存,因爲vector的capacity容量未變化,系統維護一個的默認值

有什麼方法可以釋放掉vector中佔用的全部內存呢?

標準的解決方法如下
template < class T >
void ClearVector( vector< T >& vt )
{
vector< T > vtTemp;
veTemp.swap( vt );
}

事實上,vector根本就不管內存,它只是負責向內存管理框架acquire/release內存,內存管理框架如果發現內存不夠了,就malloc,但是當vector釋放資源的時候(比如destruct), stl根本就不調用free以減少內存,因爲內存分配在stl的底層:stl假定如果你需要更多的資源就代表你以後也可能需要這麼多資源(你的list, hashmap也是用這些內存),所以就沒必要不停地malloc/free。 如果是這個邏輯的話這可能是個trade-off

一般的STL內存管理器allocator都是用內存池來管理內存的,所以某個容器申請內存或釋放內存都只是影響到內存池的剩餘內存量,而不是真的把內存歸還給系統。這樣做一是爲了避免內存碎片,二是提高了內存申請和釋放的效率——不用每次都在系統內存裏尋找一番。
真的讓容器把不用的內存歸還給系統的話,只能自己寫一個allocator,並在容器的模板參數裏使用它,而且STL的標準容器確實都留了這個接口。
不過要意識到這樣做給程序性能和系統內存帶來的影響。

clear和erase可以很好地減少了vector的大小(size),但沒有減少它的容量(capactiy)

《STL源碼剖析》《effective STL》,《深入剖析STL》值得一讀

發佈了46 篇原創文章 · 獲贊 23 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章