1. 程式人生 > >C++基礎——vector記憶體釋放

C++基礎——vector記憶體釋放

vector記憶體釋放
之前看到這個問題,沒有細究,過了兩天被問到這個問題!!!

  1. 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每一個元素都緊挨著前一個元素儲存。
  2. STL實現者在對vector進行記憶體分配時,預留了一些額外的儲存區,用於存放新新增的元素。
  3. size():成員指當前擁有的元素個數。
    capacity():成員指當前(容器必須分配新儲存空間之前)可以儲存的元素個數。
  4. 記憶體空間會自增長,需要儲存空間時候,加倍當前容量的分配策略實現重新分配。例如,當前capacity為50,當新增第51個元素時,預留空間不夠用了,vector容器會重新分配大小為100的記憶體空間,作為新連續儲存的位置。
  5. 記憶體佔用空間只增不減,clear(),erase()都是清空元素,但是空間還是沒有釋放。
  6. 需要動態清理佔用空間可以使用deque(),線性訪問,還支援從前新增元素。
  7. 預設情況下vector執行的是一種“用時間換空間”的做法,耗費大量的時間去不停的釋放舊空間,開闢新空間。所以使用vector,最好還是預估一下資料大小,儘可能的減少釋放和析構的次數。
  8. vector的解構函式由系統呼叫,比如區域性變數使用完。
  9. 手動釋放:

    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);
    
  10. vector存的指標的時候,釋放vector之前,需要把指標也釋放。
  11. 遍歷各個指標
    for (vector<void *>::iterator it = v.begin(); 
    it != v.end(); it ++) 

    if (NULL != *it) 
    {       delete *it; 
        *it = NULL;
    }
    v.clear();

另外可以看看《Effective STL》第十七條款