Bonjour développeurs.
Dans le but de créer une liste chaînée, je rencontre un problème concernant le destructeur d'une classe.
J'ai deux classes:
- Maillon qui contient un pointeur sur un autre maillon (le suivant) et une donnée
- Liste qui contient deux pointeurs sur des Maillons (le premier et le dernier)
Voici ma classe Maillon :
Et voici ma classe Liste :
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 class Maillon { friend class Liste; // Champs prives private: T _data ; Maillon *_suivant ; // Forme canonique de Coplien public: Maillon():_data(),_suivant(NULL){} Maillon(const T& data):_data(data),_suivant(NULL){} Maillon(const Maillon& m):_data(m._data),_suivant(m._suivant){} ~Maillon() { delete _suivant; } // C'est ici que le problème se pose friend ostream& operator<< (ostream& o, Maillon& m); };
La première fois que l'on passe sur la ligne (3) on détruit l'objet tmp mais aussi son suivant. ensuite on repasse sur la ligne (1), tmp pointe alors sur un objet qui vient d’être détruit. Enfin, au deuxième passage sur la ligne (3), deuxième delete sur une même zone mémoire, le programme plante :
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 class Liste { private: Maillon *_tete, *_fin ; public: Liste():_tete(NULL),_fin(NULL){} Liste(const Liste& l) ; ~Liste() // probleme : le destructeur appelle deux fois le destructeur d'un meme objet { Maillon *m = _tete; Maillon *tmp = new Maillon(); while(m != NULL) { tmp = m; //(1) m = m->_suivant; //(2) delete tmp; //(3) } _tete = NULL; _fin = NULL; }
Process terminated with status -1073741571 (0 minutes, 3 seconds)
Partager