58

構造体のstd::vectorがあるとします。ベクトルがclear()された場合、メモリはどうなりますか?

std::vector<myStruct> vecs;
vecs.resize(10000);
vecs.clear();

メモリは解放されますか、それとも再利用可能なバッファとしてvecs変数に接続されたままになりますか?

4

5 に答える 5

67

メモリはベクトルに接続されたままです。それもありそうもない。必須です。特に、を呼び出した後にベクトルに要素を再度clear()追加する場合、以前のサイズの1000を超える要素を追加するまで、ベクトルを再割り当てしてはなりません。

メモリを解放したい場合、通常は空のベクトルと交換します。C ++ 11は、shrink_to_fitほぼ同じ機能をより直接的に提供することを目的としたメンバー関数も追加しますが、拘束力はありません(つまり、余分なメモリを解放する可能性がありますが、実際にはそうする必要はありません)。

于 2012-12-19T03:03:14.740 に答える
35

ベクトルのメモリがクリアされる保証はありません。クリアした後は、要素に安全にアクセスできません。メモリの割り当てが解除されていることを確認するために、ScottMeyersは次のようにアドバイスしました。

vector<myStruct>().swap( vecs );

Cplusplus.comには、これについて次のように述べています。

ベクトルからすべての要素を削除し、それぞれのデストラクタを呼び出して、コンテナのサイズを0のままにします。

ベクトル容量は変化せず、この関数を呼び出しても再割り当ては発生しません。再割り当てを強制する一般的な代替方法は、スワップを使用することです。

于 2012-12-19T03:03:52.653 に答える
10

オブジェクトに対してデストラクタが呼び出されますが、メモリは割り当てられたままです。

于 2012-12-19T03:02:54.753 に答える
6

いいえ、メモリは解放されません。

C ++ 11では、このメソッドを使用してshrink_to_fit、ベクトルに強制的にメモリを解放させることができます。

http://www.cplusplus.com/reference/vector/vector/

于 2012-12-19T03:06:40.717 に答える
1

.resize(0)割り当てられたメモリを解放したり再割り当てしたり.clear()せず、ベクトルのサイズをゼロに変更するだけで、容量は同じままになります。

次の作業でメモリを解放(解放)してクリアする必要がある場合:

オンラインでお試しください!

v = std::vector<T>();

&&演算子のオーバーロードを呼び出します=。これは、ソリューションの場合と同様の動作を行いswap()ます。

この割り当て手法は&&、演算子の過負荷がある場合に機能=し、すべてのC ++11STDライブラリに存在することが保証されています。ここを参照してください。したがって、-std=c++11(gcc / clang)または/std:c++11(msvc)スイッチ(またはそれ以降)を使用してコンパイルすると、私のソリューションが機能することが保証されます。

于 2021-06-03T10:08:39.570 に答える