構造体のstd::vectorがあるとします。ベクトルがclear()された場合、メモリはどうなりますか?
std::vector<myStruct> vecs;
vecs.resize(10000);
vecs.clear();
メモリは解放されますか、それとも再利用可能なバッファとしてvecs変数に接続されたままになりますか?
構造体のstd::vectorがあるとします。ベクトルがclear()された場合、メモリはどうなりますか?
std::vector<myStruct> vecs;
vecs.resize(10000);
vecs.clear();
メモリは解放されますか、それとも再利用可能なバッファとしてvecs変数に接続されたままになりますか?
メモリはベクトルに接続されたままです。それもありそうもない。必須です。特に、を呼び出した後にベクトルに要素を再度clear()
追加する場合、以前のサイズの1000を超える要素を追加するまで、ベクトルを再割り当てしてはなりません。
メモリを解放したい場合、通常は空のベクトルと交換します。C ++ 11は、shrink_to_fit
ほぼ同じ機能をより直接的に提供することを目的としたメンバー関数も追加しますが、拘束力はありません(つまり、余分なメモリを解放する可能性がありますが、実際にはそうする必要はありません)。
ベクトルのメモリがクリアされる保証はありません。クリアした後は、要素に安全にアクセスできません。メモリの割り当てが解除されていることを確認するために、ScottMeyersは次のようにアドバイスしました。
vector<myStruct>().swap( vecs );
Cplusplus.comには、これについて次のように述べています。
ベクトルからすべての要素を削除し、それぞれのデストラクタを呼び出して、コンテナのサイズを0のままにします。
ベクトル容量は変化せず、この関数を呼び出しても再割り当ては発生しません。再割り当てを強制する一般的な代替方法は、スワップを使用することです。
オブジェクトに対してデストラクタが呼び出されますが、メモリは割り当てられたままです。
いいえ、メモリは解放されません。
C ++ 11では、このメソッドを使用してshrink_to_fit
、ベクトルに強制的にメモリを解放させることができます。
.resize(0)
割り当てられたメモリを解放したり再割り当てしたり.clear()
せず、ベクトルのサイズをゼロに変更するだけで、容量は同じままになります。
次の作業でメモリを解放(解放)してクリアする必要がある場合:
v = std::vector<T>();
&&
演算子のオーバーロードを呼び出します=
。これは、ソリューションの場合と同様の動作を行いswap()
ます。
この割り当て手法は&&
、演算子の過負荷がある場合に機能=
し、すべてのC ++11STDライブラリに存在することが保証されています。ここを参照してください。したがって、-std=c++11
(gcc / clang)または/std:c++11
(msvc)スイッチ(またはそれ以降)を使用してコンパイルすると、私のソリューションが機能することが保証されます。