C++基礎——vector記憶體釋放
阿新 • • 發佈:2019-02-20
vector記憶體釋放
之前看到這個問題,沒有細究,過了兩天被問到這個問題!!!
- 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每一個元素都緊挨著前一個元素儲存。
- STL實現者在對vector進行記憶體分配時,預留了一些額外的儲存區,用於存放新新增的元素。
- size():成員指當前擁有的元素個數。
capacity():成員指當前(容器必須分配新儲存空間之前)可以儲存的元素個數。 - 記憶體空間會自增長,需要儲存空間時候,加倍當前容量的分配策略實現重新分配。例如,當前capacity為50,當新增第51個元素時,預留空間不夠用了,vector容器會重新分配大小為100的記憶體空間,作為新連續儲存的位置。
- 記憶體佔用空間只增不減,clear(),erase()都是清空元素,但是空間還是沒有釋放。
- 需要動態清理佔用空間可以使用deque(),線性訪問,還支援從前新增元素。
- 預設情況下vector執行的是一種“用時間換空間”的做法,耗費大量的時間去不停的釋放舊空間,開闢新空間。所以使用vector,最好還是預估一下資料大小,儘可能的減少釋放和析構的次數。
- vector的解構函式由系統呼叫,比如區域性變數使用完。
手動釋放:
vector nums; nums.push_back(1); vector().swap(nums);||或者nums.swap(vector ())
少有人用的方法: vector S; int* p = S.get_allocator().allocate(10); S.get_allocator().deallocate(p,100);
- vector存的指標的時候,釋放vector之前,需要把指標也釋放。
- 遍歷各個指標
for (vector<void *>::iterator it = v.begin();
it != v.end(); it ++)
if (NULL != *it)
{ delete *it;
*it = NULL;
}
v.clear();
另外可以看看《Effective STL》第十七條款