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

 C++ Discussion :

libération de la mémoire pour un vector de pointeur


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 21
    Points : 12
    Points
    12
    Par défaut libération de la mémoire pour un vector de pointeur
    Bonjour,

    Désolé ce sont des questions de réels débutants qui ne maitrisent pas très bien les pointeurs...

    Je souhaiterai savoir comment libérer mon espace mémoire quand j'utilise un vecteur de pointeur (sur un objet) !

    Faut-il que je fasse l'effacement du vecteur avant ou après avoir effacer mes pointeurs sur les objets ?

    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
    18
    19
     
    #include <vector>
     
    int main()
    {
    vector<Object*> vect;
     
    // fonction qui remplit le vecteur avec les Object
    remplirVecteur(vect);
     
    //...
     
    // effacement de tous les objets du vecteur
    effacerContenuVecteur(vect);
     
    // effacement du vecteur
    vect.clear;
    vect.delete;
    }
    Autre question :
    Faut-il que j'efface mes pointeurs à chaque fois que j'entre un Objet dans un vecteur ?

    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
     
    const int nbElement 10;
     
    void remplirVecteur(vector<Object* > vect)
    {
    int i;
    Obect* myObject
    for(i=0;i<nbElement;i++)
    {
    myObject = new Object(i);
    }
    // faut'il que je fasse ici :
    delete myObject
    // au risque de perdre tout ce que je voulais dans mon vecteur
    }
    Dernière question :
    Mes Object ont eux aussi des pointeurs qui sont effacer dans le destructeur, est ce que cela suffit pour libérer l'espace mémoire (l'appel est automatique à la fin de la session).
    Ou faut'il que j'efface chaque pointeur "tout seul" ?

    Je vous remercie d'avance pour toutes vos remarques et réponses.
    Cordialement.

  2. #2
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par bobo034 Voir le message
    Désolé ce sont des questions de réels débutants qui ne maitrisent pas très bien les pointeurs...
    Pas de désolé, tu es dans le sous-forum "Débuter", il est là pour ça. Et c'est bien en ayant cela à l'esprit que tu auras des réponses.
    Citation Envoyé par bobo034 Voir le message
    Je souhaiterai savoir comment libérer mon espace mémoire quand j'utilise un vecteur de pointeur (sur un objet) !

    Faut-il que je fasse l'effacement du vecteur avant ou après avoir effacer mes pointeurs sur les objets ?
    Il faut que tu libère l'espace mémoire occupé par chacun de tes objets avant d'en supprimer les pointeurs.
    Tu peux voir le pointeur comme un fil te reliant à un ballon de baudruche. Le ballon (= objet) occupe de l'espace dans l'air (= espace mémoire), et si tu coupes le fil (= détruis le pointeur) sans avoir dégonflé le ballon (= détruit correctement), celui-ci, toujours intact (= occupant de la mémoire), s'envole sans que tu puisses le récupérer (= fuite mémoire).
    Citation Envoyé par bobo034 Voir le message
    Faut-il que j'efface mes pointeurs à chaque fois que j'entre un Objet dans un vecteur ?
    Je ne comprends pas ta question, sois plus explicite.
    Citation Envoyé par bobo034 Voir le message
    Mes Object ont eux aussi des pointeurs qui sont effacer dans le destructeur, est ce que cela suffit pour libérer l'espace mémoire (l'appel est automatique à la fin de la session).
    Ou faut'il que j'efface chaque pointeur "tout seul" ?
    Si le destructeur efface tes objets par un delete, alors le destructeur de ces objets sera appelé. Etait-ce bien ta question?

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 395
    Points : 23 759
    Points
    23 759
    Par défaut
    Hello,

    Les pointeurs sont des registres aux même titre que les variables ordinaires. Ils contiennent simplement l'adresse en RAM d'autre chose. Si tu as besoin de libérer cette chose, la commande delete aura besoin de cette adresse pour la retrouver et la libérer, et tu la trouveras dans le pointeur. Maintenant, rien ne lie spécialement le pointeur avec l'objet qu'il pointe.

    Je me trompe peut-être mais ton mode de raisonnement ressemble à celui du monde Java. Si c'est bien le cas, sache qu'un pointeur n'est pas l'équivalent d'une référence Java. Il n'y a pas de compteur de référence sur les objets pointés qui se décrémente à chaque fois que l'on va ramener un pointeur à NULL. Il n'y a pas non plus de grande faucheuse^W^W de garbage collector pour aller emporter ces objets lorsque leur compteur arrive à zéro.

    Donc, pour répondre à tes questions :

    - Si tu as un vecteur de pointeurs, oui, il faut le scanner manuellement pour détruire les objets qu'ils pointent ... si c'est bien cela que tu veux faire ! En effet, rien n'empêche un autre pointeur d'indiquer le même objet quelque part ailleurs. Si tu détruis automatiquement les objets pointés à la destruction du vecteur, ça pourrait mettre le souk dans une autre section de ton programme.

    À la place, crée directement un vecteur d'objets plutôt que de passer par les pointeurs intermédiaires.

    - À la destruction de l'objet pointé, il est effectivement conseillé de remettre ton pointeur à Null, mais c'est plus une règle de bon usage qu'une nécessité technique. Un pointeur se contente de charier une adresse mémoire. Rien ne dit que ce qui s'y trouve est toujours valide. En particulier, si tu fais un delete() à cet endroit, pas de problème, ton objet sera effacé. Si tu refais un second delete() au même endroit, plantage.

    L'usage veut donc que l'on efface proprement un pointeur lorsqu'il ne référence plus rien. Ce n'est pas une obligation, et c'est surtout vrai avec les pointeurs persistants. Si tu es sur le point de détruire le vecteur qui les contient, tu n'es pas obligé de les remettre à Null d'abord.

    - Pour ta dernière question : non, la disparition des pointeurs avec celle du vecteur qui les contient n'engendrera pas la destruction des objets pointés et ce pour une bonne raison : ton pointeur n'est pas doté d'un destructeur.

  4. #4
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Les pointeurs sont des registres aux même titre que les variables ordinaires. Ils contiennent simplement l'adresse en RAM d'autre chose. Si tu as besoin de libérer cette chose, la commande delete aura besoin de cette adresse pour la retrouver et la libérer, et tu la trouveras dans le pointeur. Maintenant, rien ne lie spécialement le pointeur avec l'objet qu'il pointe.
    Je suis totalement d'accord, bien qu'un pointeur n'ait pas de sens sans objet pointé. Je voulais juste ne pas pondre de pavé tout de suite et y aller molo
    Citation Envoyé par Obsidian Voir le message
    En effet, rien n'empêche un autre pointeur d'indiquer le même objet quelque part ailleurs. Si tu détruis automatiquement les objets pointés à la destruction du vecteur, ça pourrait mettre le souk dans une autre section de ton programme.
    +1 également, plusieurs pointeurs peuvent pointer sur la même zone, et en supprimer un ne doit pas invalider les autres. Soit il faut les supprimer tous d'un coup en même temps que le delete, soit c'est le dernier restant qui fait le delete avant dêtre détruit mais il faut qu'il sache qu'il est le dernier... Ce qui implique une gestion lourde des objets.
    Citation Envoyé par Obsidian Voir le message
    À la place, crée directement un vecteur d'objets plutôt que de passer par les pointeurs intermédiaires.
    C'est effectivement la solution la plus sûre car les destructeurs gèreront tout seuls la libération de la mémoire.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup, j'adore la métaphore et elle explique beaucoup de choses.
    Tu peux voir le pointeur comme un fil te reliant à un ballon de baudruche. Le ballon (= objet) occupe de l'espace dans l'air (= espace mémoire), et si tu coupes le fil (= détruis le pointeur) sans avoir dégonflé le ballon (= détruit correctement), celui-ci, toujours intact (= occupant de la mémoire), s'envole sans que tu puisses le récupérer (= fuite mémoire).
    Pour la question que tu ne comprends pas, ta métaphore y réponds !
    Il ne faut pas que je détruise le pointeur au risque de perdre son emplacement mémoire.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 395
    Points : 23 759
    Points
    23 759
    Par défaut
    Citation Envoyé par spoutspout Voir le message
    Je suis totalement d'accord, bien qu'un pointeur n'ait pas de sens sans objet pointé. Je voulais juste ne pas pondre de pavé tout de suite et y aller molo
    Et encore, on passe sur les pointeurs void * :-)

  7. #7
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par bobo034 Voir le message
    Il ne faut pas que je détruise le pointeur au risque de perdre son emplacement mémoire.
    Il ne faut pas que tu détruises le pointeur au risque de perdre le lien avec la zone mémoire pointée.
    Le pointeur est situé à un certain emplacement mémoire, et son contenu est l'adresse d'un autre emplacement mémoire.
    Attention à bien saisir cette différence.

    Citation Envoyé par Obsidian
    Et encore, on passe sur les pointeurs void * :-)
    Chut! Chaque chose en son temps

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 21
    Points : 12
    Points
    12
    Par défaut
    Merci à vous deux pour vos rapides réponses


    Citation Envoyé par Obsidian Voir le message
    Et encore, on passe sur les pointeurs void * :-)
    Oui mieux vaut passer ce sera pour une autre fois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. surcharger -> pour un vector de pointeur.
    Par Marlwyn dans le forum Langage
    Réponses: 20
    Dernier message: 19/05/2011, 13h49
  2. Vector et libération de la mémoire
    Par Bundy*Al dans le forum C++
    Réponses: 5
    Dernier message: 14/06/2008, 15h50
  3. Libération de la mémoire
    Par gibet_b dans le forum Composants VCL
    Réponses: 3
    Dernier message: 30/06/2004, 12h02
  4. Economie de mémoire pour plusieur images avec la même source
    Par neness dans le forum Composants VCL
    Réponses: 5
    Dernier message: 18/01/2004, 10h56

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