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 :

problème de compréhension des pointeurs


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut problème de compréhension des pointeurs
    Bonjour,

    Nouveau sur le forum et nouveau dans le monde du C++.

    Dans mon apprentissage je suis actuellement sur les pointeurs et j'ai une difficulté à comprendre ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     int varPile = 5;
     int* pTas = new int;
     *pTas = 10;
    Jusque la pas de problème chacun possède son adresse et sa valeur un sur la pile l'autre sur le tas.
    Maintenant si je fais :

    J'affecte l'adresse de varPile à pTas, mais l'adresse initiale de pTas est tel perdu ?

    Ce qui pose véritablement un problème est utilisation de :
    qui me renvois une erreur au debug et qui le laisse penser que l'adresse initiale de pTas est perdu.

    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut, et bienvenue sur le forum.

    La toute première chose à savoir: on évite les pointeurs comme la peste si on a la possibilité de faire autrement.

    C'est vrai pour les débutants car les pointeurs sont très difficiles à appréhender dans leur ensemble, et c'est vrai pour les gens plus habitués car ils savent tous les problèmes que cela peut poser.

    La deuxième chose qu'il faut savoir, c'est que new va en réalité demander au système d'exploitation de fournir "une certaine quantité" de mémoire. Tant que l'application n'indique pas explicitement au système d'exploitation qu'elle n'a plus besoin de la mémoire qu'il lui a fournie au travers de l'appel à delete (et que l'application continue à fonctionner), le système d'exploitation considérera que cette mémoire est utilisée.

    Autrement dit, tout la mémoire allouée par new (ou par new[]) DOIT être libérée par un appel équivalent à delete (ou à delete[]) lorsqu'elle devient inutile pour l'application. Autrement, c'est carrément la stabilité du système d'exploitation qui sera mise en jeu, car, si toutes les applications qui tournent (dont certains services qui tournent "en arrière plan") décident de garder la mémoire qu'elles ont demandé, on peut avoir autant de mémoire que l'on souhaite sur un ordinateur, on finira tôt ou tard par ... ne pas en avoir assez

    Par contre, il faut savoir que le fait d'appeler delete (ou delete[]) avec de la mémoire allouée sur la pile va occasionner ce que l'on appelle un "comportement indéfini" qui, dans les faits, se traduira généralement par un plantage pur et simple de l'application.

    Si donc tu te retrouves au final avec un code qui pourrait se simplifier en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int * ptr = new int; //OK: demande "assez d'espace mémoire" au système d'exploitation pour contenir une donnée de type int
    int data = 10; // OK: déclare une donnée de type int "sur la pile"
    ptr = & data; // CRACK (1)
    delete data: // BOUM (2)
    Le (1) posera plusieurs gros problèmes.

    Le principal sera en fait de perdre l'adresse mémoire à laquelle commence l'espace suffisant pour contenir un int alloué par le système d'exploitation et, du coup, de perdre la possibilité de lui rendre cet espace mémoire lorsque l'on n'en aura plus besoin (en plus de nous empêcher d'y accéder bien sur). On va donc avoir une "fuite mémoire" qui, à termes, si elle se répète "suffisamment souvent" aura pour résultat de saturer toute la mémoire dont on dispose sur l'ordinateur, et c'est carrément le système d'exploitation qui en subira les conséquences.

    Mais, en plus, le (1) va mettre en place une situation dans laquelle le comportement indéfini du (2) ne pourra pas faire autrement que de survenir étant donné que ptr va désormais représenter l'adresse à laquelle se trouve une donnée déclarée sur la pile.

    Lorsque l'application exécutera cette ligne de code, le système d'exploitation "engueulera" l'application en lui disant "je ne t'ai pas prêté la mémoire qui se trouve à cette adresse" et l'application va sans doute planter.
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour et merci pour ta réponse

    Effectivement ayant repris le début de mes lectures et les explications que tu me fourni, je me rend compte que l'allocation de l'adresse de l'autre variable engendrais cette fuite mémoire et donc l'adresse initiale ne pouvais plus être libéré.

    Merci

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2021
    Messages : 1
    Points : 4
    Points
    4
    Par défaut
    Je ne dirais pas que les débutants doivent fuir les pointeurs mais plutôt prêter attention a leurs utilisations et prendre le temps de se renseigner sur leurs utilisations.
    On voit trop souvent des programmes simples ou la mémoire est mal géré...
    Heureusement maintenant on a des Giga de RAM... Ça résous beaucoup de problèmes.

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Citation Envoyé par flo3ds2 Voir le message
    Je ne dirais pas que les débutants doivent fuir les pointeurs mais plutôt prêter attention a leurs utilisations et prendre le temps de se renseigner sur leurs utilisations.
    On voit trop souvent des programmes simples ou la mémoire est mal géré...
    Heureusement maintenant on a des Giga de RAM... Ça résous beaucoup de problèmes.
    A vrai dire, cela ne résout rien... Cela ne fait que reporter le problème, ce qui rendra encore plus difficile de se rendre compte qu'il existe

    A l'heure actuelle, les meilleurs conseils que l'on puisse donner à un débutant sont
    1. évite les pointeurs si tu n'est pas face à l'impossibilité de faire autrement
    2. si tu crois devoir utiliser un pointeur comme argument de fonction, préfères utiliser une référence
    3. si tu crois devoir utiliser l'allocation dynamique de la mémoire, fais un tour du coté de la bibliothèque standard pour voir si elle ne propose rien qui pourrait t'être utile
    4. si tu n'as vraiment pas d'autre choix, utilise les pointeurs intelligent
    5. si tu ne sais pas ce que sont les pointeurs intelligents ou comment les utiliser, attend de savoir avant d'avoir recours à l'allocation dynamique de la mémoire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/03/2009, 13h48
  2. Problème de compréhension des CSocket
    Par olator dans le forum MFC
    Réponses: 4
    Dernier message: 05/11/2008, 10h52
  3. Réponses: 3
    Dernier message: 16/06/2008, 18h15
  4. Réponses: 2
    Dernier message: 14/12/2007, 02h47
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 23h07

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