web-dev-qa-db-ja.com

std :: vectorメモリはクリア時に解放されますか?

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

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

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

46
user236520

メモリはベクターにアタッチされたままです。解放したい場合、通常は空のベクターと交換します。 C++ 11は shrink_to_fit ほぼ同じ機能をより直接的に提供することを目的としたメンバー関数ですが、バインドされていません(つまり、余分なメモリを解放する可能性がありますが、そうする必要はありません)。

53
Jerry Coffin

ベクターのメモリがクリアされることは保証されていません。クリア後​​に要素に安全にアクセスすることはできません。メモリの割り当てを確実に解除するには、Scott Meyersがこれを行うことをお勧めします。

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

Cplusplus.com には次のように書かれています:

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

ベクトルの容量は変化せず、この関数の呼び出しによる再割り当ては発生しません。再割り当てを強制する典型的な代替手段は、swapを使用することです:...

27

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

7
Ryan Guthrie

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

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

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

4
BAK