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 :

precision sur delete d'un pointeur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    En rupture avec la societé
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : En rupture avec la societé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Par défaut precision sur delete d'un pointeur
    bonjour,

    avec les lectures pour ma formation, je lis:
    après utilisation, la zone mémoire définie à l'aide du mot clé new doit être libérée pour être rendu au système. Pour cela appelez le mot clé delete sur le pointeur.
    de mon coté je test ceci:
    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
     
    int main()
    {
        using namespace std;
        int variableLocale = 5;
        int * pLocal = &variableLocale;
        int * pTas = new int;
        *pTas = 7;
     
        cout << "VariableLocale : " << variableLocale << endl;
        cout << "*pLocal : " << *pLocal << endl;
        cout << "*pTas : " << *pTas << " => " << pTas << endl;
     
        delete pTas;
        pTas = new int;
        *pTas = 9;
     
        cout << "*pTas : " << *pTas << " => " << pTas << endl;
        delete pTas;
     
        cout << "*pTas : " << *pTas << " => " << pTas << endl;
        return 0;
    }
    delete supprime bien la mémoire réservé pour l'objet, mais le pointeur en lui même il existe toujours a l'adresse de stockage.

    la dernière sortie de flux : *pTas : 6164688 => 0x5e1058

    est-il possible de le supprimé ou simplement de le rendre null avec *pPointeur = 0;
    merci

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Il ne faut pas confondre le fait de modifier la variable pointée par un pointeur et celui de modifier l'adresse vers laquelle pointe le pointeur.

    Si tu écrit
    tu affecte la valeur 0 à... ce qui est pointé par pTas.

    Dans l'exemple que tu montres, cela fonctionnera uniquement parce que pTas est un pointeur sur... un entier, et que les entiers sont... compatibles avec la valeur 0.

    Dés que tu travailleras avec des types personnalisés, il y a de fortes chances que le compilateur t'envoie gentiment balader parce qu'il est dans l'impossibilité d'assigner la valeur 0 à une variable de ton type personnalisé (avec cependant une exception que je tairai ici pour ne pas rendre les choses plus compliquées à comprendre que ce qu'elles ne le sont déjà )

    Par contre, il faut savoir qu'un pointeur n'est jamais qu'une variable numérique comme une autre (dans le sens où la valeur qu'elle représente ne change normalement pas toute seule), un peu particulière dans le sens où elle ... permet simplement de représenter l'adresse mémoire à laquelle se trouve la variable du type indiqué.

    Ainsi, lorsque tu écris le code
    tu donne à ptas la valeur numérique entière correspondant à l'adresse à laquelle se trouve... un espace mémoire (alloué de manière dynamique) suffisant grand pour représenter un int.

    A l'inverse, lorsque tu écris
    tu ne fais rien d'autre que de demander au système de libérer la mémoire allouée (grace à l'instruction new dont je viens de parler) pour représenter ce int...

    Cela ne modifie en rien l'adresse représentée par pTas: cela ne fait réellement qu'invalider ce qui se trouve à l'adresse en question

    Si, par la suite, tu essaye d'utiliser pTas, il contiendra donc... toujours l'adresse à laquelle se trouvait le int alors que celui-ci n'existe plus, et que l'adresse mémoire est potentiellement utilisée par autre chose.

    Ce qu'il faut donc faire, c'est donner à pTas (et non à "ce qui est pointé par" pTas) une valeur qui puisse être reconnue comme étant invalide, et qui pourra donc être testée.

    Cette adresse, c'est NULL ou 0.

    Mais il faut donc veiller à écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pTas = NULL; /* ou pTas = 0; */
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *pTas = NULLL; /* ou pTas = 0; */
    dont je t'ai expliqué plus haut que ca ne faisait absolument pas la même chose, et que cela a même de grandes chances d'être refusé par le compilateur pour les types que tu auras toi-même définis.

    [EDIT]Il est d'ailleurs de bon ton, lorsque tu déclare un pointeur, de veiller à lui affecter la valeur NULL si tu ne lui affecte pas directement une adresse correcte et quand tu libère la mémoire correspndante et, si tu as des raisons de croire qu'il peut ne pas pointer vers une adresse mémoire correcte, de veiller à tester systématiquement s'il est égal ou non à NULL...
    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
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Une simple MACRO peu appeler le delete et réinitialiser le pointeur à null.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define SAFEDELETE(pointer) if((pointer)) \ 
                               { delete (pointer); pointer = NULL; }

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Pourquoi tester si le pointeur n'est pas null? C'est couteux pour rien.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Une simple MACRO peu appeler le delete et réinitialiser le pointeur à null.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define SAFEDELETE(pointer) if((pointer)) \ 
                               { delete (pointer); pointer = NULL; }
    Citation Envoyé par Goten Voir le message
    Pourquoi tester si le pointeur n'est pas null? C'est couteux pour rien.
    En effet, delete sur NULL est garanti sans danger

    Ce qui est dangereux, c'est n'importe quel accès (y compris par delete) à une adresse déjà libérée, car cela provoque un comportement non défini
    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. précisions sur glutPostRedisplay()
    Par khayyam90 dans le forum GLUT
    Réponses: 4
    Dernier message: 29/07/2004, 10h03
  2. Precision sur l'encodage de caractere
    Par La Truffe dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 19/05/2004, 13h52
  3. besoin de precision sur gluLookAt!
    Par bakonu dans le forum OpenGL
    Réponses: 3
    Dernier message: 25/04/2004, 19h05
  4. precision sur le pilotage du port parallele
    Par fransouik dans le forum C++Builder
    Réponses: 18
    Dernier message: 26/02/2004, 13h28
  5. [VBA-E]Demande de précision sur les menus
    Par geffdenimes dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/06/2003, 10h46

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