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 :

questions sur les pointeurs


Sujet :

C++

  1. #1
    Membre du Club Avatar de Hyoga
    Inscrit en
    Décembre 2004
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 154
    Points : 42
    Points
    42
    Par défaut questions sur les pointeurs
    Salut,

    Bon j'ai vu un quelques tutos sur les pointeurs je ne vois pas pourquoi ils sont si craints ?
    Car on les utilisent avec des trucs compliqués ? du genre ?
    ça sert concrétement a quoi ? parce que allocation dynamique ça me dit rien
    C'est vrai qu'on cherche a les supprimer ? donc ça servira a rien dans le futur ce que j'ai appris ?

    En fait faut retenir

    * pointe
    & adresse

    Sachant que int *p; est déclaré
    Si &m=W alors *W=m donc p=&m = W autrement dit l'adresse de m est W par conséquent W pointe sur m et donc p est l'adresse de m.
    Or l'adresse de m est W donc p=&m = W.

    Apres on peut aussi faire de l'arithmetique et faire des trucs du genre

    pour le décalage du pointeur vers la droite c'est p=p+1 donc là il va se décaler d'une case.
    logiquement pour aller vers la gauche c'est p=p-1 mais j'ai pas essayé peut etre que ça marche pas

    donc si on fait
    p=&m;
    p++;

    en fait on va de m ou W si vous preferez jusqu'a la limite imposé

    on peut meme pointer sur des tableaux
    int var[50];
    int *p;
    p=&var[3]; // pointe sur le 3emme element du tableau

    voilà en gros le reste c'est des trucs evident quand on connait les pointeurs. peut etre qu'ils étaient pas complet non plus les tutos que j'ai lu. y'a d'autres trucs à savoir ? (important)

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    pas la peinde de faire un cours sur les pointeurs

    le fait est qu'on les utilise le moins possible en C++ pour la simple et bonne raison qu'ils sont souvent inutiles. Dans 90% des cas une reference & remplacera avantageusement un pointeur. Pour les autres cas il faut etre prudent, la manipulation de pointeur peut creer des erreurs difficiles à debugger, des fuites memoires en cas d'allocation dynamiques, etc .

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 82
    Points : 71
    Points
    71
    Par défaut Re: questions sur les pointeurs
    Citation Envoyé par Hyoga
    Car on les utilisent avec des trucs compliqués ? du genre ?
    Un cas simple. Comment fais tu une classe qui encaspule correctement un pointeur?

  4. #4
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut Re: questions sur les pointeurs
    Citation Envoyé par Hyoga
    ...
    y'a d'autres trucs à savoir ? (important)
    les pointeurs sur fonction (pour, par ex., les fonctions de CALLBACK), toujours fun à déclarer quand on n'a pas l'habitude du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *( *(*var)() )[10];
    (extrait du MSDN)
    pis des trucs du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p = ptr1 + (ptr2 - ptr3 + 1);
    mais c'est plus un héritage du C que du C++ actuel.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    voilà en gros le reste c'est des trucs evident quand on connait les pointeurs. peut etre qu'ils étaient pas complet non plus les tutos que j'ai lu. y'a d'autres trucs à savoir ? (important)
    Les pointeurs sont aussi utilisés pour le polymorphisme.
    Un exemple vite fait:

    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
    // class.h
    #include <iostream>
     
    class A {
     public:
      virtual void afficher() { std::cout << "A" << std::endl; }
    };
     
    class B : public A {
     public:
      void afficher() { std::cout << "B" << std::endl; }
    };
     
    class C : public A {
     public:
      void afficher() { std::cout << "C" << std::endl; }
    };
    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
    #include <iostream>
    #include "class.h"
     
    int main() {
      A* test = new A();
      test->afficher();
      delete test;
     
      test = new B();
      test->afficher();
      delete test;
     
      test = new C();
      test->afficher();
      delete test;
     
      return 0;
    }
    La fonction main affichera A B C. Les pointeurs permettent de manipuler les types dérivés à partir des types de bases.

  6. #6
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    un problème avec les pointeurs c'est que quand on développe quelques milliers/millions de lignes de code, il arrive qu'on oublie de désallouer la mémoire lorsque le pointeur n'est plus utilisé (quand la mémoire est full-->c mort)

    même sans arriver dans des gros code on en oublie.

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La fonction main affichera A B C
    La fonction main affichera A.... puis plantera . Ne pas oublier de déclarer virtuel le destructeur des classes de base, lorsqu'on utilise le polymorphisme.

    A part ça, je crois qu'il y a suffisamment de cours sur les pointeurs qui trainent sur le net. Le plus important en C++ est d'essayer de se passer de pointeurs bruts, donc tant que tu n'en as pas besoin ne cherche pas à savoir quel genre de bêtises tu pourrais faire avec.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    La fonction main affichera A.... puis plantera Ne pas oublier de déclarer virtuel le destructeur des classes de base, lorsqu'on utilise le polymorphisme.
    Ah ouais j'avais oublié ça . Pourtant ça marche chez moi avec g++ 3.3.3, peut-être qu'il le fait tout seul.

  9. #9
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour être précis ça mène à un comportement indéterminé, donc il se peut très bien que (malheureusement) ça marche.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous,

    Cela peut être aussi rendu plus ou moins stable grâce aux bibliothèques de débogage qui surchargent les allocations et suppressions en mode #ifdef DEBUG et vont se charger de... faire planter le programme le plus souvent et le plus tôt possible !

    Exemple de pratiques de ces bibliothèques :
    - remplissage et altération des données entre la déclaration et l'allocation, ainsi qu'à la suppression (vous avez peut-être vu dans votre débogueur des 0xfeed, 0xcdcd...). Cela évite d'utiliser des pointeurs avant qu'ils soient alloués et après leur destruction.
    - entourer des tableaux par des "watchdogs", qui sont testés à la destruction de celui-ci pour vérifier que vous n'avez pas débordé d'un côté ou de l'autre.
    - comptage des allocations et suppressions, vérifications en fin de programme de l'absence de fuites de mémoire.

    On peut aussi rentre le code plus facile à écrire et à lire grâce à des classes templates qui encapsulent la construction et la destruction du pointeur.

    On est souvent confronté à ce genre de situations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    A a* = new A();
    a->Foo();
    /* ... plein de code ... */
     
    // code rajouté par mise à jour
    if( condition )
        return;
     
    /* ... plein de code ... */
     
    a->Foo2();
    delete a;
    Ici on est en présence d'une fuite de mémoire, c'est un peu grossier mais le principe à retenir c'est que c'est la complexité de l'arbre des possible qui peut rendre la mise en évidence de bugs de pointeurs.

    De plus si on commence à avoir une pagaille de variables, il devient difficile et/ou lourdingue de tout libérer proprement et de suivre la ligne de vie de chacune d'entre elles.

    On peut remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CPointeur<A> a = new A();
    où CPointeur se charge de détruire le pointeur correctement lorsqu'il devient hors de portée.

    Ces classes et bibliothèques sont souvent fournies avec l'outil de développement, mais rares savent l'utiliser, qu'elles existent ou comprennent leur intérêt et se penchent quelques instants dessus.

    Quelques "best practices" et stratégies aussi évitent bien des erreurs, comme les assertions (toujours dans l'idée d'anticiper le plantage) qui font qu'on peut utiliser les pointeurs "à sec" ou avec des pratiques se sécurité et une méthode tout le long du programme, qui n'est pas une perte de temps bien au contraire !

    La mauvaise réputation des pointeurs vient en grande partie des premiers jours du C++ où les éditeurs et les bibliothèques ne faisaient pas grand chose pour faciliter leur utilisation.

    Citation Envoyé par Elendil_BzH
    Ah ouais j'avais oublié ça . Pourtant ça marche chez moi avec g++ 3.3.3, peut-être qu'il le fait tout seul.
    Dans ton exemple, ça marche parce que l'adresse désignée par le pointeur est marquée comme libre mais par souci d'économie de temps, le programme ne modifie pas le contenu de l'adresse après suppression (comme tout programme le fait en mode RELEASE). En mode DEBUG, certaines bibliothèques font remplacer un simple delete par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete p; memset(p, "0xcd", sizeof(p));
    (ou équivalent, c'est le principe qui compte)

    Dans ce cas, ton programme aurait planté (access violation) et tu aurais détecté ton erreur tout de suite.

    Enfin voilà, il y aurait beaucoup à dire mais en conclusion, le C++ permet de faire un peu ce qu'on veut avec la mémoire, c'est un jouet "pour les grands" donc c'est normal que cela comporte quelques risques et que cela nécessite une certaine maîtrise pour fonctionner correctement sans surprises, l'un ne va pas sans l'autre.

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonsoir,

    L'utilisation de pointeur en C++, et surtout avec la STL est vouée à l'oubli.

    Il existe des classes "fonctions" en C++ qui remplacent les pointeurs sur méthodes de classe.

    J'ai l'impression qu'il faut penser "java" pour coder en C++.

    Est-ce une illusion ?

    Cordialement.

  12. #12
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 150
    Points : 180
    Points
    180
    Par défaut
    Pour coder en C++ il faut penser C++, pour coder en Java il faut penser en Java.

    Mais il est clair que l'utilisation de pointeurs (bruts) està eviter dans de gros projets. Par ailleurs je tiens à preciser que toutes les techniques de debug (0xCDCDCDCD, Watch Dogs etc...) sont integrés dans Visual .NET c'est ultra pratique.

  13. #13
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par dj.motte
    L'utilisation de pointeur en C++, et surtout avec la STL est vouée à l'oubli.
    Je dirais plutôt que l'utilisation directe (càd sans smart pointers) de pointeurs à un haut niveau d'abstraction dans un programme est de plus en plus rare, mais dans un bas niveau, elle reste primordiale.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  14. #14
    Membre actif Avatar de Grulim
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 234
    Points : 288
    Points
    288
    Par défaut
    Citation Envoyé par JolyLoic
    Citation Envoyé par dj.motte
    L'utilisation de pointeur en C++, et surtout avec la STL est vouée à l'oubli.
    Je dirais plutôt que l'utilisation directe (càd sans smart pointers) de pointeurs à un haut niveau d'abstraction dans un programme est de plus en plus rare, mais dans un bas niveau, elle reste primordiale.
    tout a fait d'accord, ne jetons pas l'eau du bain avec le bébé (ou le contraire ), les pointeurs peuvent rendre de fiers services et ceci de maniere fiable, tout dépend du serieux de la conception et du codage
    d'autre part, penser Java pour coder en C++, cela me semble absurde (sans vouloir vexer personne).

  15. #15
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Bonsoir,

    Ne me faîtes pas dire ce que je ne voulais pas. Certes l' utilisation de pointeurs en C++ est pertinente. D' ailleurs la STL fait un usage constant de pointeurs. Regarder le code source de "vector" par exemple, bien c'est plein de pointeurs !

    Par contre l' utilisation de la STL fait en sorte que la manipulation des pointeurs soit invisible au développeur.

    La philosophie de la STL est de ne pas se servir de manière abusive de pointeurs, pour le développeur. Et même de décourager ceux qui se lancent dans des constructions trop sophistiquées.

    Par ex :
    Pointeur sur méthode de classe avec foreach(...).
    OOPS !

    Je vais finir par créer l "Association pour la sauvegarde des pointeurs en C++" !

    Soyons sérieux.

    Cordialement.

  16. #16
    Membre habitué
    Profil pro
    Enculeur de mouches
    Inscrit en
    Septembre 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : Enculeur de mouches

    Informations forums :
    Inscription : Septembre 2003
    Messages : 133
    Points : 161
    Points
    161
    Par défaut
    Bienvenue Bigjim !!!
    Citation Envoyé par bigjim2
    - entourer des tableaux par des "watchdogs", qui sont testés à la destruction de celui-ci pour vérifier que vous n'avez pas débordé d'un côté ou de l'autre.
    Ce type de garde est implémentée par ElectricFence (lib de debug sous GNU/Linux, en tout cas, pour le reste sais pas) en utilisant l'avantage du mode protégé:
    Le système alloue avant et après les variables du processus d'autres blocs mémoires ne lui appartenant pas. Du coup, le programme plante sur l'instruction exacte qui cause le débordement.

    Citation Envoyé par bigjim2
    Citation Envoyé par Elendil_BzH
    Ah ouais j'avais oublié ça . Pourtant ça marche chez moi avec g++ 3.3.3, peut-être qu'il le fait tout seul.
    Dans ton exemple, ça marche parce que l'adresse désignée par le pointeur est marquée comme libre mais par souci d'économie de temps, le programme ne modifie pas le contenu de l'adresse après suppression (comme tout programme le fait en mode RELEASE). En mode DEBUG, certaines bibliothèques font remplacer un simple delete par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete p; memset(p, "0xcd", sizeof(p));
    (ou équivalent, c'est le principe qui compte)

    Dans ce cas, ton programme aurait planté (access violation) et tu aurais détecté ton erreur tout de suite.
    Là pas d'accord. On a bien des paire d'alloc/désalloc...
    Et comme les constructeurs/destructeurs par défaut se valent (et ne font rien), il n'y aurait pas eu de problème !!! (se rappeller que l'appel aux destructeurs et "récursif" et non succéssif... je me comprends)

    Citation Envoyé par dj.motte
    Je vais finir par créer l "Association pour la sauvegarde des pointeurs en C++" !
    Je postule pour trésorier !!!
    Gaïa n'est pas une marchandise.

  17. #17
    Membre actif Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Points : 281
    Points
    281
    Par défaut
    et moi pour secrétaire vive les pointeurs !
    I'm the kind of guy that until it happens, I won't worry about it. - R.H. RoY05, MVP06

  18. #18
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Steki-kun
    et moi pour secrétaire vive les pointeurs !
    je suis membre actif du club, mais désolé, je ne fais que du C
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

Discussions similaires

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

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