C++ベース-vectorメモリ解放
vectorメモリがリリースされる前にこの問題を見て、詳しく調べていなかったので、2日後にこの問題を聞かれました!!!高速ランダムアクセスをサポートするためにvectorコンテナの要素は連続的に格納され、各要素は前の要素に隣接して格納されます. STLインプリメンテーションは、vectorにメモリ割り当てを行うときに、新しく追加された要素を格納するための追加のストレージ領域を予約します. size():メンバーは、現在所有している要素の数を指します.Capacity():メンバーは、現在(コンテナが新しいストレージスペースを割り当てる必要がある前に)格納できる要素の数を指します. メモリ容量は自己増加し、ストレージ容量が必要な場合は、現在の容量を倍にした割り当てポリシーで再割り当てが実現されます.たとえば、現在のcapacityは50で、51番目の要素を追加すると、予約領域が不足し、vectorコンテナは新しい連続記憶の場所として100サイズのメモリ領域を再割り当てします. メモリ占有スペースは増加しないだけで、clear()、erase()はすべてクリア要素ですが、スペースは解放されていません. は、deque()を使用して、線形アクセスを使用したり、以前の要素の追加をサポートしたりするために、動的クリーンアップ占有領域を必要とします. デフォルトではvectorは「時間で空間を変える」方法を実行し、古い空間を解放し、新しい空間を開くのに多くの時間を費やしています.したがってvectorを用いるには,データサイズを推定し,放出と析出の回数をできるだけ減らすことが望ましい. vectorの構造関数は、局所変数などのシステムによって呼び出されます. 手動解放: vectorが格納しているポインタの場合、vectorを解放する前に、ポインタも解放する必要があります. 各ポインタ を巡回する.
また、『Effective STL』第十七条もご覧いただけます
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);
for (vector<void *>::iterator it = v.begin();
it != v.end(); it ++)
if (NULL != *it)
{ delete *it;
*it = NULL;
}
v.clear();
また、『Effective STL』第十七条もご覧いただけます