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 :

Simple question sur les pointeurs


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut Simple question sur les pointeurs
    Bonjour,
    ralala ces petites choses ... il faudra un jour que je m'y fasse ;o)

    Juste histoire d'être sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
    int a = 0 ;
    int * i ;
    i = &a ;
    }

    Ce pointeur est détruit aprés mon acolade c'est ca ?

    Sinon dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {
    int * P ;
    int * I = new int(6) ;
    I = P;
    // delete I ; -> provoque une erreur
    }
    C'est pas bon signe ca, non ?

    [ ca va surement paraitre bête ce que je vais dire mais tant pis ^^ ]

    Alors à chaque fois qu'on veux affecter un nouvel objet à un pointeur, il faut détruire le précédent, sinon la mémoire ne sera jamais libérée ?

    Merci

  2. #2
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Ce pointeur est détruit aprés mon acolade c'est ca ?
    Oui.

    Alors à chaque fois qu'on veux affecter un nouvel objet à un pointeur, il faut détruire le précédent, sinon la mémoire ne sera jamais libérée ?
    Seulement si le précédent a été alloué avec new.

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {
    int a = 0 ;
    int * i ;
    i = &a ;
    }
    Ce pointeur est détruit aprés mon acolade c'est ca ?
    Oui
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {
    int * P ;
    int * I = new int(6) ;
    I = P;
    // delete I ; -> provoque une erreur
    }
    C'est pas bon signe ca, non ?
    C'est normal. L'adresse retournée par new est perdue, on ne peut plus faire le delete correspondant au new. On fait un delete sur une adresse non obtenue par new (I contient avant le delete la valeur qui est dans P (donc n'importe quoi dans ce code) )

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Bien, bien, merci je vais faire plus attention à tout ca désormais

  5. #5
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    Oui il faut effacer la memoire si tu veux reassigner ton pointeur, a condition que ton pointeur ait bien ete allouer par tes soins avec un new.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    f()
    {
       int *P;  //ici P n'est pas initialisé donc son adresse est un truc du genre 0xfffffff
       int *I = new int(6); //adresse 0x00046c28 par exemple
     
       delete I; //efface la memoire allouée a l'adresse 0x00046c28
       I = P; // change l'adresse de I pour celle de P
       delete P; //provoque une erreur car P n'a pas ete initialisé et son adresse n'est pas valide
    }

  6. #6
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Dans ton exemple xxiemeciel, le "delete I" efface les informations contenu dans la mémoire à l'adresse de I , donc à ce stade I contient toujours la même adresse ?

    Hum je crois que dans ma méoire c'était confus , en fait les pointeurs eux même sont détruit à la sortie du scope mais pas les données pointés, ce qui représente effectivement un danger dans le cas d'une allocation dynamique .... dites, dites, j'ai bon ?

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Dans ton exemple xxiemeciel, le "delete I" efface les informations contenu dans la mémoire à l'adresse de I , donc à ce stade I contient toujours la même adresse ?
    plus exactement, le delete libère la mémoire attribuée et la rend ainsi disponible pour la suite
    Hum je crois que dans ma méoire c'était confus , en fait les pointeurs eux même sont détruit à la sortie du scope mais pas les données pointés, ce qui représente effectivement un danger dans le cas d'une allocation dynamique .... dites, dites, j'ai bon ?
    Oui!!! (si les pointeurs en question stockent l'adresse d'objets créés par new) Mais ce n'est pas un danger, il faut simplement comprendre ce qui se passe effectivement "en dessous" de ce qu'on écrit. Le C++ (comme le C) a un niveau d'abstraction qui nécessite la compréhension des mécanismes sous-jacents

  8. #8
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Le mieux pour ne pas toucher à de la mémoire interdite, quand tu créés un pointeur alors tu le fait pointer sur NULL, et tu te dis qu'avant tout new sur un vecteur, alors il doit être NULL. Ca va t'éviter de faire des bétises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int* pI = NULL;    // Je le mets à NULL dès le départ
    int I = 4;
    pI = new int(4);
    pI =  I;    // Ben la je me dis : j'ai pas le droit car pI ne pointe pas sur NULL
    // Alors je me mets une claque :twisted:
    C'est un truc mémotec... ou mnémotruc... J'ai pas dis qu'avant de faire un new il fallait vérifier si le pointeur était NULL, j'ai juste dis que si tu gardais toujours ça en tête alors ça peut te fair éviter des erreurs...

  9. #9
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Ce n'est pas pI = &I plutot ?
    Enfin je pense retenir que "new" va avec "delete", et effctivement, penser à intialiser mes pointeur a NULL a leur création et aprés un delete me semble une bonne habitude à prendre .

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Citation Envoyé par Clad3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
    int a = 0 ;
    int * i ;
    i = &a ;
    }
    Ce pointeur est détruit aprés mon acolade c'est ca ?
    euh ...
    A la sortie de ton bloc, a n'existe plus, i n'existe plus.
    i pointait vers a. En supposant que tu "exportes" la valeur de i (qui est une adresse!), cela serait une adresse vers une donnée qui n'existe plus.

    Alors à chaque fois qu'on veux affecter un nouvel objet à un pointeur, il faut détruire le précédent, sinon la mémoire ne sera jamais libérée ?
    C'est pour cela que les pointeurs intelligents (et le RAII de manière générale) sont nos amis.

    Le mieux pour ne pas toucher à de la mémoire interdite, quand tu créés un pointeur alors tu le fait pointer sur NULL, et tu te dis qu'avant tout new sur un vecteur, alors il doit être NULL
    Le mieux, c'est de faire comme pour toute variable : on la crée initialisée!
    Quand vraiment on ne peut pas faire autrement (car elle sera initialisée dans un switch-case, ou autre structure de saut conditionnel), tu l'initialises à une valeur bidon connue comme telle (0 est fait pour ça chez les pointeurs) -- bien que je préfère avoir des petites fonctions qui retourneront le résultat de la construction conditionnelle, ce qui me permet de n'avoir qu'une seule construction/affectation, sans réaffectation ultérieure.

    Et au fait, je ne fais JAMAIS de new sur des vecteurs. Mes vecteurs (std::vector) vivent sur la pile et leur mémoire est automatiquement gérée, même si il y a des exceptions.

Discussions similaires

  1. Question sur les pointeurs génériques
    Par mikedavem dans le forum C
    Réponses: 16
    Dernier message: 24/05/2006, 11h56
  2. question sur les pointeurs
    Par jd.baculard dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2006, 02h30
  3. [Debutant] Nouvelle question sur les pointeurs
    Par etiennegaloup dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2006, 09h55
  4. Question sur les pointeurs.
    Par Chrisemi dans le forum C++
    Réponses: 5
    Dernier message: 28/10/2005, 23h47
  5. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25

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