Bonjour,
toujours dans ce projet j'ai maintenant une erreur de compilation.
(je vous présente d'abord les extraits de code PUIS les questions)
(dans les extraits suivants je coupe volontairement le code)
J'ai créé un noeud
puis la liste avec sentinelles
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 template <typename T> struct DNode { T val; //!< Value for this node, can be anything DNode<T> *prev; //!< Pointer to the previous node DNode<T> *next; //!< Pointer to the next node // constructeur par défaut et copie mais pas destructeur et autres méthodes pratiques //! Destructor is useless because automatically called when deleting struct DNode, setting a destructor will cause calling ~T twice /*~DNode() { //! Default destructor //! @todo : if val = NULL, what happens when calling its destructor ? val.~T(); // explicit call to the destructor }*/ }
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 template <typename T> class DLList { // typedef struct DNode<T> Node; this could be used to simplify the writing friend class testDLList; // provide access for a test class friend class testIterators; private : DNode<T>* head; //! Handle on first data node (if any) DNode<T>* tail; //! Handle on last data node (if any) DNode<T>* fore; //! Handle on leading sentinel node DNode<T>* aft; //! Handle on trailing sentinel node unsigned int m_size; //! Holds the number of nodes // constructeurs, méthodes, destructeurs, itérateurs ... }
Je vais utiliser cette liste pour stocker des pointeurs d'une classe TranslatableObserver disons donc quelque part j'ai ça en membre d'une classe :
Ensuite, j'ai l'erreur de compilation suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DLList<TranslatableObserver*> list;
l'erreur se situe dans le destructeur de ma DLList donc voici le code :error: invalid conversion from ‘void*’ to ‘DNode<TranslatableObserver*>*’
Le problème se situe sur les "= NULL", avec dans mon cas :
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 template <typename T> DLList<T>::~DLList(void) { // Deallocate all nodes, even the sentinels DNode<T>* temp = NULL; while(fore != NULL) { temp = fore; fore = fore->next; delete temp; } // the following statement is not completely true : // Don't need to set head and tail to NULL nor m_size to 0 because we don't care right now head = NULL; tail = NULL; fore = NULL; aft = NULL; m_size = 0; }
Les questions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define NULL ((void*)0)
1 - Vous remarquez que j'ai volontairement dégagé struct DNode<T>::~DNode<T>() (ou tout simplement le destructeur d'un noeud).
Lors de mes tests j'ai crée une classe 'personne' comportant un membre int et un tableau name avec allocation dynamique. Dans le destructeur de 'personne' je faisais un delete de 'name' sans mettre 'name' à NULL, chose que j'avais jugée inutile.
Ensuite, je stockais une liste de 'personne', les noeuds étant donc des 'personne'.
Je me suis aperçu lors du debug qu'en détruisant un noeud je passais deux fois dans le destructeur de 'personne' et puisque personne::name n'avait pas été mis à NULL la première fois alors plantage. La seule solution que j'ai trouvé a été d'enlever le destructeur d'un noeud pour éviter que struct DNode<T>::~T() soit appelé deux fois. Pourquoi est-il appelé deux fois ?
2 - Pourquoi pour résoudre mon erreur de compilation je peux mettre 0 à la place de NULL ?
Partager