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:
(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.
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; } };
Typiquement :
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) !.
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;
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
Partager