Considérons le code suivant, compilé avec g++ problem.cpp -o problem
:un problème désallocation de mémoire pour std non-créé dynamiquement :: vecteurs de stockage de données normale (non alloués dynamiquement)
#include <vector>
using namespace std;
int main()
{
while(1){}
return 0;
}
Lorsque ce code est exécuté, la commande top
signale que ~ 80 Ko de mémoire est en cours consommé.
Ne manquez ce code:
#include <vector>
using namespace std;
int main()
{
vector<int> testVec;
for(int i = 0;i<100000000;i++)testVec.push_back(i);
while(1){}
return 0;
}
Comme prévu, haut rapport que près de ~ 300 Mo de mémoire est consommée.
Maintenant, enfin, considérer ce code:
#include <vector>
using namespace std;
int main()
{
vector<int> testVec;
for(int i = 0;i<100000000;i++)testVec.push_back(i);
testVec.clear();
vector<int>().swap(testVec);
while(1){}
return 0;
}
maintenant top
rapports que ~ 4196K est consommé - pourquoi pas seulement ~ 80K est que dans le premier exemple (!)? Comment puis-je enfin libérer ce dernier morceau de mémoire qui est vraisemblablement consommé par le vecteur? J'ai lu que, en plus de .clear()
, le «tour de swap» est destiné à libérer tout mais apparemment il ne fonctionne pas comme je m'y attendais. Qu'est-ce que je rate?
Les vecteurs allouent dynamiquement leurs données. Comment pourraient-ils pas? –
... dans l'implémentation sous-jacente. Je vois maintenant que peut-être mon énoncé de problème est en effet naïf, mais encore l'esprit boggle .. –
Par la nature même de la question, vous parlez des détails les plus bas niveau de la mise en œuvre sous-jacente. Comment pouvez-vous simultanément prétendre les abstraire? –