IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

[std::vector] probleme de desallocation memoire


Sujet :

SL & STL C++

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut [std::vector] probleme de desallocation memoire
    Bonjour,

    j'utilise le std::vector, ne connaissant pas a priori la taille de mes tableaux.
    Par exemple, pour un tableau de coordonnées :
    - Declaration :
    std::vector<CFPoint> tabVertex , CFPoint étant une classe à moi, composée par 3 float x, y, z
    - Suppression :
    tabVertex.erase( tabVertex.begin() , tabVertex.end() );

    Lors de la suppression, il n'y a pas du tout de liberation de memoires.
    Dans un cas plus simple de std::vector<int>, non plus.
    Est-ce que je m'y prends mal avec "erase", y a-t-il un moyen de désallouer proprement la memorie avec ces "vectors" ? svp !
    Merci , bon aprem.
    Jc.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    C'est une des spécificités des vectors, "malheureusement". Ca peut être un avantage ou un inconvénient.
    Si par exemple, tu ajoutes, puis tu enlèves, tu rajoutes à nouveau, tu enlèves, ... c'est un avantage indéniable car il n'y a pas réallocation de la mémoire, recopie intégrale, ...
    Si tu ne fais qu'ajouter puis enlever définitivement, c'est un inconvénient, mais tu aurais peut-être pu l'éviter en faisant d'une autre manière, qui sait.

    En fait, pour toi, un clear() est sans doute plus appropiré, non ? Et même, le vecteur est effacé et désalloué une fois que la classe est morte ou que la fonction est finie - selon que ton vecteur est dans une classe ou une variable locale d'une fonction/méthode -

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il y a l'astuce du swap pour virer l'espace mémoire alloué inutilement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<CFPoint>(tabVertex).swap(tabVertex)
    Puisque tu veux carrément le vider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<CFPoint>().swap(tabVertex)

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Merci, je ne connaissais pas ce truc du swap, j'essaye de l'implémenter de suite...
    J'ai aussi le cas d'un tableau de tableaux :
    std::vector<CEdge> tabEdge;
    Avec,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class CEdge
    {
    public:
    std::vector<unsigned short int> edge_;
    CEdge()
    {
    edge_.clear();
    }
    CEdge(const CEdge& edge)
    {
    edge_.clear();
    edge_ = edge.edge_;
    }

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Ca va peut etre poser des probleme ! il faut que j'applique le swap dans la classe CEdge ?

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    En fait je viens de coder ton "swap", et la memoire n'est toujours pas rendue... !!!

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par jcloupgarou
    En fait je viens de coder ton "swap", et la memoire n'est toujours pas rendue... !!!
    Mais de quelle mémoire parles-tu, au fait ? Et comment vois-tu qu'elle n'est pas libérée ?

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Et bien en fait, vu que tout ca c'est pour une appli 3D, j'ai des tableaux de vertex de plusieurs centaines de milliers de float(pas mal d'MO en RAM). Et c'est cette meme ram qui ne diminue pas lorsque je lance la suppression de ces tableaux.

  9. #9
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Comment mesures-tu la RAM occupée ? Es-tu sûr que c'est ces tableaux qui sont en cause ? Un millier de float, ça ne fait que 4Ko, pas 1 Mo.

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Je regarde le gestionnaire des processus de windows. Je sais que c pas tres precis, mais ca suffit pour me rendre compte que la RAM attribuée à mon appli ne diminue pas entre avant et apres la suppression de ces tableaux.
    De plus je sais que 1000 float font 4Ko, mais moi j'ai des tableaux de 100000 float (400Ko), voir plus, l'augmentation de Ram allouée pour le processus est flagrante dans le "gestionnaire win", surtout que je n'ai pas qu'un seul tableau par objet 3D créé (vertex, normales, index)...
    J'ai essayé de remodeler mes classes, en separant les tableaux vector qui seront entierement vidés dans un classe à part. je declare un pointeur sur cette nouvelle classe, que je delete quand je veux vider les tableaux... Toujours pas de memoire rendue...!!!

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Est-ce que cette taille augmente lorsque tu crées puis détruis tes vecteurs ? Parce que même si tu détruis les objets, l'allocateur mémoire peut conserver cette mémoire désallouée pour la redonner à un autre demandeur dans la foulée, donc on crois qu'elle n'est pas désallouée.
    Mais si ce n'est pas le cas, ta fuite mémoire est sans doute autre part.

  12. #12
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Merci de vous penchez sur mon pb, c cool !
    En fait, quand je créée ma forme 3D, je remplis quatre "vector", deux de float, deux de int. L'augmentation de RAM utilisée par le prog est flagrante lors de cette creation, je peux la suivre au fur et à mesure du remplissage des tableaux.
    je créée ensuite des display list opengl avec ces tableaux, donc de nouveau auglmentation de la Ram. Une fois ces listes d'affichage constituées, je veux vider mes tableaux... Et c la que le bas blesse... Ils se vident mais la memoire n'est pas rendue ou disponible, la creation d'un nouvel objet 3D accroissant encore celle-ci directement(apparemment pas redonnée à un autre demandeur).
    Je ne vois vraiment pas d'ou ca pourrait venir d'autre, je ne fait pas d'autres traitement ou creation que ca. Remplir des tableaux, en faire des displayList et tenter de vider mes tableaux...

  13. #13
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par jcloupgarou
    Je regarde le gestionnaire des processus de windows.
    vector fait un peut ce qu'il veut lors d'un clear()/erase(). Ca peut varier d'une STL à l'autre. En revanche à sa destruction, la mémoire est normalement libérée. Pendant son utilisation, c'est mois sûr.
    Il faut donc détruire ton vector, ou faire un swap avec un temporaire.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <vector>
    using namespace std;
     
    #include <windows.h>
     
    int main()
    {
        ::Sleep( 5000 );
        vector<float> v1( 10000000 );
        ::Sleep( 2000 );
        v1.clear();
        ::Sleep( 2000 );
        v1.swap( vector<float>() );
        ::Sleep( 2000 );
        vector<float> v2( 10000000 );
        ::Sleep( 2000 );
    }
    si je trace au gestionnaire des tâches, j'ai 40 Mo alloués, puis toujours 40Mo malgré le clear(), puis 40 Mo libérés, et re 40 Mo alloués.

  14. #14
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    vector fait un peut ce qu'il veut lors d'un clear()/erase(). Ca peut varier d'une STL à l'autre. En revanche à sa destruction, la mémoire est normalement libérée. Pendant son utilisation, c'est mois sûr.
    Il faut donc détruire ton vector, ou faire un swap avec un temporaire.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <vector>
    using namespace std;
     
    #include <windows.h>
     
    int main()
    {
        ::Sleep( 5000 );
        vector<float> v1( 10000000 );
        ::Sleep( 2000 );
        v1.clear();
        ::Sleep( 2000 );
        v1.swap( vector<float>() );
        ::Sleep( 2000 );
        vector<float> v2( 10000000 );
        ::Sleep( 2000 );
    }
    si je trace au gestionnaire des tâches, j'ai 40 Mo alloués, puis toujours 40Mo malgré le clear(), puis 40 Mo libérés, et re 40 Mo alloués.
    Je viens de tester la capacity() après un clear() : elle est inchangée sous VC++ 8. C'est variable d'un compilo à l'autre je pense.

  15. #15
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Je suis en train de tester ce que tu me conseilles, merci beaucoup !!!

  16. #16
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Ca a l'air de fonctionner un peu mieux. Il ne desalloue pas effectivement la RAM, mais elle parait disponible (certains nouveaux objets 3D sont créés sans augmentation de la Ram).
    J'ai encore des leaks, mais c deja ca, merci !!!

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/08/2013, 20h56
  2. Probleme avec std::vector push_back
    Par raphchar dans le forum C++
    Réponses: 4
    Dernier message: 19/12/2011, 14h18
  3. Probleme avec std::vector
    Par dhoorens dans le forum SL & STL
    Réponses: 2
    Dernier message: 12/03/2007, 16h51
  4. manipulation de std::vector probleme memoire
    Par angediablo dans le forum SL & STL
    Réponses: 20
    Dernier message: 03/08/2006, 19h10
  5. Problem avec std::vector
    Par boiteweb dans le forum SL & STL
    Réponses: 5
    Dernier message: 29/04/2006, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo