web-dev-qa-db-fra.com

La mémoire std :: vector est-elle libérée sur un espace libre?

Supposons que j'ai un vecteur std :: de structures. Qu'arrive-t-il à la mémoire si le vecteur est clair () 'd?

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

La mémoire sera-t-elle libérée ou toujours attachée à la variable vecs en tant que tampon réutilisable?

46
user236520

La mémoire reste attachée au vecteur. Si vous voulez le libérer, l'habituel est d'échanger avec un vecteur vide. C++ 11 ajoute également un shrink_to_fit fonction membre destinée à fournir à peu près la même capacité plus directement, mais elle n'est pas contraignante (en d'autres termes, elle est susceptible de libérer de la mémoire supplémentaire, mais n'est pas vraiment nécessaire pour le faire).

53
Jerry Coffin

La mémoire du vecteur n'est pas garantie d'être effacée. Vous ne pouvez pas accéder aux éléments en toute sécurité après un effacement. Pour vous assurer que la mémoire est désallouée, Scott Meyers a conseillé de le faire:

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

Cplusplus.com a ce qui suit à dire à ce sujet:

Supprime tous les éléments du vecteur, appelant leurs destructeurs respectifs, laissant le conteneur avec une taille de 0.

La capacité vectorielle ne change pas et aucune réallocation ne se produit en raison de l'appel de cette fonction. Une alternative typique qui force une réallocation est d'utiliser le swap: ...

27
Alexander Chertov

Le destructeur est appelé sur les objets, mais la mémoire reste allouée.

7
Ryan Guthrie

Non, la mémoire n'est pas libérée.

En C++ 11, vous pouvez utiliser le shrink_to_fit méthode pour forcer le vecteur à libérer de la mémoire.

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

4
BAK