スタック上に次のようにベクトルを作成した場合、次のようになります。
void foo(){
std::vector<int> vec;
}
実行が終了foo
すると、vecに割り当てられたメモリが解放されます。ただし、内でこのメモリを解放する方法foo
。コンテナをクリアするだけなので、vec.clear()を探していません。コンテナに割り当てられたメモリを解放します。
{}
スコープブロックを使用して、ベクトルの有効期間をより厳密に制御します。
void foo()
{
{
std::vector<int> vec;
// stuff that uses vec
}
// stuff that doesn't
}
C ++ 11で使用でき、C ++ 03でトリック関連の同等のものを試すことができますが、なぜですか?!shrink_to_fit
絶対に何もする必要はありません。ベクトルクラスのデストラクタがベクトルを破棄し、変数が関数の最後でスコープ外になるとメモリを解放するため、それ自体が処理されます。
編集:あなたが本当にやりたいことがバジリオン数を読み込んで、6、7、2で割り切れないが42に等しくないものをすべて削除するようなものなら、それは保持したくない数値を格納するための 2 番目のベクトルを作成し、元のベクトルを範囲外にすることをお勧めします。
私の意見では、ベクトルに割り当てられたメモリをすべて解放することができます
。
2. ベクトルにポインター要素が含まれている場合、生のポインター (ANSI C) の代わりにスマート ポインター (shared_ptr、unique_ptr) を使用します。
3. raw ポインタを使用していた場合は、使用をやめるときに free() することを忘れないでください。
上記vec.resize(0); vec.shrink_to_fit();
で提案された (C++11) が利用できない場合は、 と非常によく似たものを得ることができますvector<int>().swap(vec);
。これを行うことができる場合は、追加の{}
ブロックに配置することをお勧めします (必ずしも簡単ではありませんが、通常は実行可能です)。
ただし、一時オブジェクトとのスワップは、スワップする一時オブジェクトに対して (不必要な) 動的割り当てを行う可能性が高く、現在のスコープの終わりまで小さなブロックを割り当てたままにすることに注意してください。また、実際のオブジェクト (それが保持するデータではなく) がスタック上で占有して
いる 4 ~ 8 バイトのメモリを明らかに解放しません(スコープの最後だけがそれを行うことができます)。 vector
とはいえ、ほとんどの場合、努力全体が無駄になります。後で同じスコープで大量のメモリが必要ない場合は、ベクトルを早く解放するか遅く解放するかは問題ではありません。ずっと前に失敗したか (その場合、問題全体は発生しません!)、またはどちらの方法でも関数の最後まで機能します。
一方、後で同じ関数 (たとえば、同様のサイズの別のベクトル) で大量のメモリが必要になることがわかっていて、これが問題になると予想するのが合理的である場合、解放するかどうかを予測するのは困難です。最初のものは本当に違いを生みます (特にswap
トリックを行うときの断片化を考えてください)。
2 番目のベクトルが最初のベクトルと同じか小さい場合にのみ、これが確実に機能することが期待できます。それ以外の場合は、より適切に機能するとは限りません。