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

Discussion :

Gestion de pointeurs

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut Gestion de pointeurs
    bonjour à tous,
    dans le cours de c++, il est préciser qu'après avoir appliquer delete sur un pointeur, qu'il est nécessaire de le mettre à zéro.

    voici ce que je veux dire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int *pointeur(0);
    int x;
     
    pointeur=&x;
     
    .............
     
     
    delete pointeur;
     
    pointeur(0);
    Peut-on appliquer cette démarche en Qt ou bien c'est gérer automatiquement par Qt?

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Qt est un framework C++ donc forcément y'a aucune différence avec du C++ sans Qt.
    En revanche, comme beaucoup de choses qui existent en version QChose, tu as les QPointer qui s'utilisent comme des pointeurs à ceci prêt qu'ils sont mis à 0 lorsqu'on les delete :

    A guarded pointer, QPointer<T>, behaves like a normal C++ pointer T *, except that it is automatically set to 0 when the referenced object is destroyed (unlike normal C++ pointers, which become "dangling pointers" in such cases). T must be a subclass of QObject.

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    dans le cours de c++, il est préciser qu'après avoir appliquer delete sur un pointeur, qu'il est nécessaire de le mettre à zéro.
    La question importante est : pourquoi on fait ça ?

    Si on écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A* p = new A();
    p = new A();
    delete p;
    première ligne, on créé un premier objet dynamique A et on met son adresse mémoire dans la variable p. A la seconde ligne, on créé un second objet A et on met son adresse mémoire également dans la variable p. A ce moment là, il n'y a plus de variable qui conserve l'adresse mémoire du premier objet A. A la 3ème ligne, lorsque l'on fait un delete, on supprimer que le second objet A en mémoire et il n'est pas possible de supprimer le premier objet A. On a une fuite mémoire.

    Pour éviter ça, une méthode est de mettre les variables pointeurs qui ne pointent vers aucun objet à 0 (ou à NULL ou le mieux nullptr en C++11). Il faut donc toujours affecter une valeur à un pointeur à l'initialisation (soit avec new, soit mettre 0) et tester le pointeur avant de faire un new :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A* p = 0;
    if (!p)
        p = new A();
    delete p;
    p = 0;
    Pour éviter ces problèmes, en C++ on utilise le RAII et son application directe qui sont les pointeurs intelligents.

    Cas particulier avec Qt : il existe un système de destruction des hiérarchies d'objets Qt, lorsque l'on détruit un objet, les enfants de cet objet sont automatiquement détruits. Il faut bien comprendre que cela détruit uniquement les objets, mais ne touche pas aux pointeurs (et ne les remets pas à 0)


    Deux remarques importantes sur ton code :
    1. l'écriture pointeur(0); n'est pas valide
    2. avec ton delete, tu essaies de supprimer un objet créé statiquement sur la pile et non sur le tas. Il faut relire un cours sur les pointeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A* p = 0;
    p = new A();
    delete p; //ok, A est créé dynamiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A* p = 0;
    A a;
    p = &a;
    delete p; //erreur, A n'est pas créé dynamiquement

Discussions similaires

  1. une mauvaise gestion de pointeur ?
    Par SergioMaster dans le forum Débuter
    Réponses: 8
    Dernier message: 19/04/2012, 09h34
  2. gestion du pointeur
    Par dido1987 dans le forum Débuter
    Réponses: 15
    Dernier message: 10/05/2011, 17h27
  3. Gestion des pointeurs
    Par koukiya dans le forum Débuter
    Réponses: 3
    Dernier message: 15/12/2008, 01h08
  4. Problème avec str_sub et gestion des pointeurs
    Par toine44 dans le forum Débuter
    Réponses: 4
    Dernier message: 11/06/2008, 15h30
  5. Problème de gestion de chaînes avec pointeur
    Par LorDjidane dans le forum C
    Réponses: 18
    Dernier message: 19/10/2005, 15h40

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