Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : STL: pb mémoire "physique" non libérée avec un vector [ Algorithme / Maths ] (pipocodesrc)

jeudi 12 juin 2008 à 10:22:38 | STL: pb mémoire "physique" non libérée avec un vector

pipocodesrc

Bonjour à tous, j'utilise des vecteurs pour stocker des objets 3d, ors la mémoire physique utilisée par le vecteur au fur et à mesure de ses besoins n'est pas libérée mais gardée comme "réservoir" pour optimiser les futures insertions/suppression sans avoir à réallouer, opération couteuse s'il en est.
Existe t il un moyen de libérer la totalité de la mémoire physique ou revenir au début (juste après le new du vecteur ) sans avoir à le supprimer/recréer ?
Merci de vos réponses

code de test :
vector <int> *t=new vector<int>; //mem=2.7Mb size=0 capacity=0
t->reserve (10000000);               //mem=2.7Mb size=0 capacity=10000000
for (int i=0;i<10000000;i++) t->push_back(2);  //mem=41.8Mb size=10000000 capacity=10000000
t->resize (5000000);                  //mem=41.8Mb size=5000000   capacity=10000000
t->clear();                                 //mem=41.8Mb size=10000000 capacity=10000000
delete t;                                   //
t=new vector<int>;                    //mem=2.7Mb size=0 capacity=0


jeudi 12 juin 2008 à 18:31:35 | Re : STL: pb mémoire "physique" non libérée avec un vector

nickydaquick

Membre Club
Salut,

1) si tu peux eviter l'allocation du vecteur sur le tas , c une bonne idee
2) si la memoire allouee te derange tu pourrais implementer toi meme un container de stockage , ca pourrait une idee la dans ce cas tu controllerait la taille de memoire allouee.

ce sont juste des idees. salut

[ Lien ]
je suis heureux de faire partie d'une grande famille ...!

jeudi 12 juin 2008 à 20:44:40 | Re : STL: pb mémoire "physique" non libérée avec un vector

pipocodesrc

C déjà le cas au niveau de l'allocation, et je n'avais pas envie de "jouer" avec l'Allocator, la STL est sensée être une toolbox integrated, mais merci qd même Nicki
...


jeudi 12 juin 2008 à 20:52:38 | Re : STL: pb mémoire "physique" non libérée avec un vector

luhtor

Ca sert a rien d'allouer un std::vector dans le tas:

{
vector <int> t;
t.reserve (10000000);               //mem=2.7Mb size=0 capacity=10000000
for (int i=0;i<10000000;i++) t.push_back(2);  //mem=41.8Mb size=10000000 capacity=10000000
t.resize (5000000);                  //mem=41.8Mb size=5000000   capacity=10000000
t.clear();                                 //mem=41.8Mb size=10000000 capacity=10000000
}

J'ai pas tout a fait la meme chose, lorsque je fais le test. tout d'abord je comprend pas ta valeur en rouge car 10 millions d'entiers, ca fait a peu près 40Mo.
De meme la valeur en bleu, c'est 0. Donc je comprend pas pk tu mets 10E6. Petite erreur lors du post ?

Sinon, je vois pas cmt forcer le conteneur a libérer toute sa mémoire.

jeudi 12 juin 2008 à 21:16:18 | Re : STL: pb mémoire "physique" non libérée avec un vector

pipocodesrc

Salut, regarde plus bas, c sera  plus clair que mon prec post.
et quand on a une dizaine de vecteurs qui sont joueurs en taille ca devient intéressant au bout d'un moment
....

void test_vector()
{
vector<int> *t;
cout<<endl<<"before allocation.."; getche (); //mem=2724Kb
t=new vector<int>;
cout<<endl<<"after allocation .."<<" size="<<t->size()<<" capa="<<t->capacity(); getche (); //mem=2736Kb
t->reserve (10000000);
cout<<endl<<"after allocation.."<<" size="<<t->size()<<" capa="<<t->capacity(); getche ();//mem=2744Kb
for (int i=0;i<10000000;i++) t-> push_back(i);
cout<<endl<<"after filling.."<<" size="<<t->size()<<" capa="<<t->capacity(); getche ();//mem=41880Kb
t->clear();
cout<<endl<<"after clearing.."<<" size="<<t->size()<<" capa="<<t->capacity(); getche ();//mem=41880Kb
delete t;
cout<<endl<<"after deleting.."; getche ();     //mem=2772Kb
}

result:
before allocation..
after allocation .. size=0 capa=0
after allocation.. size=0 capa=10000000
after filling.. size=10000000 capa=10000000
after clearing.. size=0 capa=10000000
after deleting..

jeudi 12 juin 2008 à 21:37:10 | Re : STL: pb mémoire "physique" non libérée avec un vector

luhtor

Il y a toujours une petite erreur:
vector<int> *t;
cout<<endl<<"before allocation.."; getche (); //mem=2724Kb
t=new vector<int>;
cout<<endl<<"after allocation .."<<" size="<<t->size()<<" capa="<<t->capacity(); getche (); //mem=2736Kb
t->reserve (10000000);
cout<<endl<<"after allocation.."<<" size="<<t->size()<<" capa="<<t->capacity(); getche ();//mem=2744Kb


En rouge, c'est 41880Kb que l'on a, et non 2744. Le "reserve" alloue la mémoire.
Mais bon, ca ne change rien a ton pb.

vendredi 13 juin 2008 à 00:19:49 | Re : STL: pb mémoire "physique" non libérée avec un vector

pipocodesrc

Sorry mais il n'y en a pas, resrve() n'est pas resize().

void reserve(size_type n);

Increases the capacity of self in anticipation of adding new elements. reserve itself does not add any new elements. After a call to reserve, capacity() is greater than or equal to n and subsequent insertions will not cause a reallocation until the size of the vector exceeds n. Reallocation does not occur if n is less than capacity(). If reallocation does occur, then all iterators and references pointing to elements in the vector are invalidated. reserve takes at most linear time in the size of self. reserve throws a length_error exception if n is greater than max_size().


vendredi 13 juin 2008 à 17:47:50 | Re : STL: pb mémoire "physique" non libérée avec un vector

luhtor

Bien sur que si il y en a. C'est meme l'intéret de reserve. Ca permet de réserver l'espace mémoire pour éviter des réallocations inutiles lorsque l'on sait quel taille, on va avoir besoin tout en utilisant push_back. On pourrait bien sur faire un resize et utiliser l'opérateur [], ca reviendrait au meme.

Voila, tu as mis la définition, et c'est plus ou moins clairement expliquer. Grace a Reserve, on augmente la capacité du conteneur. La capacité est le nombre d'élément que l'on pourra insérer sans provoquer de réallocation. Ca me semble clair. La mémoire est allouée par Reserve.

vendredi 13 juin 2008 à 18:17:16 | Re : STL: pb mémoire "physique" non libérée avec un vector

pipocodesrc

Désolé tu as raison je pensais qu'il s'agissait d'assignation d'éléments, reserve n'en fait pas alors que resize oui, d'où mon soulignement en gras. Il n'en demeurre pas moins que mes traces avec le code ci-dessus par le task manager n'affiche pas la taille finale de 42Mb tant que des push_back n'ont pas été effectués.
... 

vendredi 13 juin 2008 à 18:32:45 | Re : STL: pb mémoire "physique" non libérée avec un vector

luhtor

En effet, j'ai testé avec devpp et Visual C++ et je n'ai pas le meme comportement. j'ai du mal a comprendre pourquoi.
Alors qu'avec Visual, le "reserve" alloue clairement les 40 Mo puisque je le vois nettement lorsque je debug ligne par ligne en ayant le gestionnaire des taches ouvert. Par contre, sous devcpp, (comme tu dis) je ne vois aucune allocation. Alors je me suis dis que peut etre, l'allocation sera faite lors de la première insertion mais ce n'est pas le cas.

Donc il faudrait creuser d'avantage et regarder le code source directement mais ca m'intéresse pas particulièrement :)


1 2

Cette discussion est classé dans : vector, mémoire, size, mem, capacity


Répondre à ce message

Sujets en rapport avec ce message

Liste Chainé en C++... [ par NitRic ] Bonjour, j'aimerais si possible un petit exemple ou bien un site qui parle des Liste Chainé en C++, pour la créée c'est ok mais c avec le fonctionneme Pb avec DRAWTEXTW [ par BULBY ] Bonjour, J'essaye de faire un tout petit programme qui affiche une chaine de caractère en japonais (unicode). Avec la fonction TextOutW, pas de problè Pointeur qui fait planter Windows !!! [ par coyito ] Salutquand je défini moi même une addresse pour un pointeur (exemple pour lire n'importe ou dans la mémoire) j'ai une erreur windows "access violation Palindrome et espaces [ par TheRecliner ] Bonjour,je dois faire petit programme qui détécte si un phrase est un plaindrome ou non....j'ai bien résussi à faire cette détection mais uniquement p Segmenter un fichier en mémoire C (seulement) [ par golum ] Voila pour ouvrir a partir de mon prog c un fichier de 20 Mo je met 1min et j'aimerais a tout pris diminuer ce temps.Est-il possible de segmenter le f Operation sur les dossier [ par Cesar4 ] Salut j'aimerais savoir comment cree un dossier le renomer et le suprimerMerci @+ VECTOR VECTOR VECTOR VECTOR !!!!!! [ par Kinamstrong ] Salut,j'ai une classe Inscrit et une classe Liste Inscrit et je voudrai utiliser Inscrit comme tyde vecteur et ListeInscrit emploiereai cette classe plusieur fenetre mais une seule en mémoire... [ par Xs ] Bon, voila.Quand je fais une nouvelle fenetre avec un code ressemblant a ca : hwnd = CreateDialog(...);ShowWindow(hwnd,SW_SHOW);......bon, et bien il Prob mem sur CreateDIBSection [ par ganjo ] Salutjessaye douvrir des images grace a OLE, se qui me permet d'ouvrir avec un meme code les images reconnu par windowsmon code est celui-ci :memset( C'est quoi float !!!? [ par ATH|500| ] Je voudrais savoir à quoi sert la commande:floatExemple: float j;


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.