C++ベース-vectorメモリ解放


vectorメモリがリリースされる前にこの問題を見て、詳しく調べていなかったので、2日後にこの問題を聞かれました!!!
  • 高速ランダムアクセスをサポートするために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』第十七条もご覧いただけます