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 :

utilité de nullptr


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut utilité de nullptr
    Bonjour,

    Faisant suite à mon apprentissage de c++ et les pointeurs, je me pose la question suivante.
    Est ce que l'utilisation d'un d'un nullptr après un delete sur un pointeur est-il recommandé ou superflu?

    Pour exemple dans ce code partiel pour ma compréhension personnel, j'ai :
    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
    20
    21
    22
    23
    24
    25
    26
     
     
    class Test {
    public:
        Test();        
        ~Test(); 
     
     
     
    private:
        int *aAge;
        int *aWeight;
    };
     
    Test::Test() {
        aAge = new int(5);
        aWeight = new int(9);
    }
     
    Test::~Test() {
        delete aAge;
        aAge = nullptr;
     
        delete aWeight;
        aWeight = nullptr;
    }
    Les différents débugs que j'effectue me monte une simple adresse à zéro, qui n'existe pas sans le nullptr.

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par ManOfStyle Voir le message
    Est ce que l'utilisation d'un d'un nullptr après un delete sur un pointeur est-il recommandé ou superflu?
    cela va dépendre si ta variable / propriété est utilisée après ou pas (... par analogie si ta variable est locale ou pas)

    Parce qu'après, comme la majorité des tests sont basés sur des tests NULL, 1 variable détruite passera le test avec 1 adresse pointant vers de la mémoire libérée.
    Mais par simplicité, on le fait automatiquement

  3. #3
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    C'est une bonne pratique à faire.

    La plupart des codes complexe vont avoir une allocation dynamique et volatile de la mémoire. Le fait de passer ton pointeur à nullptr peut te permettre de tester ton pointeur avant l'execution d'un code.

    Prenons par exemple le cas d'une classe avion qui possède un attribut de type missile.

    Lors de l'initialisation, on créé le missile (allocation de la mémoire) puis pendant le vol, l'avion le tire (on retire donc le missile, soit par un delete car on l'utilise pas, soit en déplaçant le pointeur dans une autre classe qui s'occupera de faire voler le missile).

    A partir de là, mettons que tu veuille savoir si un missile est toujours disponible pour être tiré. tu vas tester le pointeur, si tu n'as pas mis nullptr auparavant, ça va poser des soucis .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour et merci pour vos réponses.

    Ayant encore un peu approfondi mon apprentissage, mes recherches et mes tests, je me rends compte que cela n'est pas toujours utile.

    Dans mon exemple de code précédent, je crois comprendre que suite à la destruction de mon objet test il n'est pas nécéssaire d'utiliser le nullptr après le delete des objets contenu dans ma classe. Par contre lors de la destruction de mon objet test, il était logique que je le fasse.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    La bonne pratique c'est d'utiliser std::unique_ptr.
    Enfin dans ce cas simple la bonne pratique c'est de ne surtout pas utiliser de pointeurs...
    Un pointeur nu c'est réservé à des références optionnelles ou dont tu peux changer la valeur, si tu ne peux/veux pas utiliser std::reference_wrapper.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Points : 2 724
    Points
    2 724
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Un pointeur nu c'est réservé à des références optionnelles ou dont tu peux changer la valeur.
    Ou dans les sociétés qui n'ont pas visual 2015 ou sur du code legacy, c'est pour ça que j'encourage souvent à commencer par les pointeur nus, pour ensuite passer aux pointeurs intélligents, comme ça on maitrise ce qu'on fait .
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par skeud Voir le message
    Ou dans les sociétés qui n'ont pas visual 2015 ou sur du code legacy, c'est pour ça que j'encourage souvent à commencer par les pointeur nus, pour ensuite passer aux pointeurs intélligents, comme ça on maitrise ce qu'on fait .
    Je suis effectivement dans cette pratique de la base (en sup de mes cours) avec par la suite le c++ moderne pour une bonne compréhension (j'espère) de ce que je fais.

    Merci

  8. #8
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Cette histoire de « on maîtrise ce qu'on fait parce que c'est plus bas niveau » est de mon point vu complètement faux. Les pointeurs intelligents existent pour résoudre des problèmes qu'il est humainement impossible d'éviter: la garantie que le pointeur sera libéré dans tous les chemins de code. Chaque appel de fonction peut faire une exception et se sont autant de chemin de code qui amènent à des fuites mémoires potentielles. Si on explique l'allocation dynamique avec les pointeurs C, il faut expliquer ce qu'est un pointeur, ce qu'est l'allocation dynamique et ce que sont les exceptions.

    Ensuite inévitablement viennent les nombreuses erreurs de double libération, de fuite mémoire et de dangling pointer. Il faut parler du principe d'unicité, d'ownership, de bonne manière de libérer et du pourquoi il faut remettre le pointeur à nul ou pas. Insister sur le fait qu'un container de pointeur alloué dynamiquement ne se libère pas tout seul, qu'il faut des posts traitement à chaque suppression et chaque modification de valeur. Réexpliquer pourquoi cela ne fonctionne pas bien avec les exceptions, introduire la notion de RAII et finalement refaire un pointeur intelligent.

    En parlant de pointeur intelligent, on peut ignorer les exceptions et se passer des post-traitements et de remise à zéro. Les fuites mémoires, dangling pointer et double free sont normalement inexistants (du moment qu'on ne s'amuse à récupérer le pointeur sous-jacent). On a des vérifications par le compilateur/classe pour tout ce qui concerne l'ownership à travers des types sémantiques. Finalement, il y a beaucoup moins à apprendre d'un coup et le principe clef de qui est propriétaire de quoi est bien plus mis en évidence.

    Quand on a compris ça en peut revenir sur l'enfer qu'est le pointeur brut alloué dynamiquement et le maudire.

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

Discussions similaires

  1. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 19h54
  2. [J2EE] Utilité de la J2EE de SUN ?
    Par PeteMitchell dans le forum Java EE
    Réponses: 4
    Dernier message: 14/05/2004, 10h29
  3. [LG]Utilité du type enuméré ?
    Par tarbala dans le forum Langage
    Réponses: 2
    Dernier message: 10/12/2003, 16h20
  4. Le BIOS et son utilité
    Par le mage tophinus dans le forum Assembleur
    Réponses: 75
    Dernier message: 21/11/2003, 15h37
  5. utilité du binaire et hexadecimaux?
    Par souris78 dans le forum C
    Réponses: 9
    Dernier message: 01/07/2003, 15h08

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