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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ?

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