|
Trouver une ressource
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)
Informations & options pour cette discussion
|
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
|
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 :)
|
|
|
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;
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
|