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 :

Pointeur vers un emplacement supprimé


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut Pointeur vers un emplacement supprimé
    Bonjour,

    Après un passage par Java (qui ne m'a pas déplu du tout), je me trouve un peu rouillé en C++... Le pire étant les pointeurs et les références!

    Histoire de me refaire la main, je fais un petit analyseur syntaxique. La première chose à faire étant une structure de donnée en forme d'arbre pour gérer les tokens.

    J'ai donc une classe virtuelle pure (de constructeur protected) Expression, puis deux sous-classes : Constant (implémentation) et BinaryExpression (abstraite), dont dérive AddExpression (implémentation).

    Rien de compliqué. Dans BinaryExpression, j'ai deux attributs protected nommés d et g, de type Expression. Dans le destructeur de cette classe, j'ai le code suivant:

    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
     
    class BinaryExpression: public Expression
    {
     
    protected:
    	Expression* d;
    	Expression* g;
     
    public:
     
    	BinaryExpression(const Expression* d_, const Expression* g_)
    	{
    		d = const_cast<Expression*>(d_);
    		g = const_cast<Expression*>(g_);
    	}
     
    	virtual ~BinaryExpression() 
    	{
    		delete d;
    		d = NULL;
     
    		delete g;
    		g = NULL;
    	}
    };
    (j'ai mis la classe entièrement, ça ne coûte rien). L'idée étant que les différentes implémentations n'existent que lorsque l'arbre existe (agrégation je crois). En revanche, rien n'empêche l'utilisateur lambda d'avoir un pointeur vers un noeud de l'arbre.

    Typiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Constant* a = new Constant(5);
    	Constant* b = new Constant(6);
    	AddExpression* bi = new AddExpression(a,b);
     
    	cout << bi->Evaluate() << endl;
    Le problème: lorsque je détruis l'objet Bi, je détruis les objets a et b dans la classe. Mais à l'extérieur... ils ne valent pas NULL mais causent une segmentationFault si je fais a->Evaluate() (normal) !.

    Ma question est donc simple: comment puis-je m'assurer que les objets "a" et "b" valent bien NULL après la destruction de leur "copie" dans BinaryExpression?

    Merci

    Cordialement
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

  2. #2
    Membre régulier Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par delire8 Voir le message
    Bonjour,

    ((coupé))

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Constant* a = new Constant(5);
    	Constant* b = new Constant(6);
    	AddExpression* bi = new AddExpression(a,b);
     
    	cout << bi->Evaluate() << endl;
    Le problème: lorsque je détruis l'objet Bi, je détruis les objets a et b dans la classe. Mais à l'extérieur... ils ne valent pas NULL mais causent une segmentationFault si je fais a->Evaluate() (normal) !.

    Ma question est donc simple: comment puis-je m'assurer que les objets "a" et "b" valent bien NULL après la destruction de leur "copie" dans BinaryExpression?

    Merci

    Cordialement
    "a" et "b" ne sont pas "objets". Ils sont des pointeurs, et les objets sont "*a" et "*b". Tu n'as pas besoin de "a" et "b":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	AddExpression* bi = new AddExpression(new Constant(5),new Constant(6));
     
    	cout << bi->Evaluate() << endl;
    Ca c'est une solution. Voila une autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Constant* a = new Constant(5);
    	Constant* b = new Constant(6);
    	AddExpression* bi = new AddExpression(a,b);
     
    	cout << bi->Evaluate() << endl;
     
            a = NULL;
            b = NULL;
     
            delete bi;
            bi = NULL;

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut
    Ok, merci!
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    tu as toute la panoplie des pointeurs intelligents (notamment ceux de boost) pour te permettre de ne pas avoir trop à te soucier de ce genre de problème. Je te conseille vivement de t'y pencher, d'autant plus si tu viens de java et que tu es un peu rouillé avec la gestion de la mémoire.

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. convertion pointeur vers tableau
    Par gdpasmini dans le forum C++
    Réponses: 2
    Dernier message: 30/03/2006, 00h34
  3. Réponses: 12
    Dernier message: 31/12/2005, 16h01
  4. Pointeur vers fonction
    Par flopaname dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2005, 15h46
  5. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43

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