Bonjour à tous,
J'ai une question sur le fonctionnement de l'opérateur delete en debug avec le compilo de Visual 2005.
Pour vous donner le contexte, nous devons réaliser un container de type anneau.
Nous avons tout d'abord une structure de type liste chainée :
Nous avons ensuite une classe dans laquelle nous allouons au constructeur un tableau de tNode:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 struct tNode { T* elt; tNode* next_elt; }
Et enfin dans le destructeur de la classe, nous devons désallouer bien sur. Mais nous ne pouvons utiliser l'opérateur delete[] car certains éléments pourraient encore être utilisés ailleurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part tNode* nodes = new tNode[size_max+1];
Nous faisons donc une boucle sur les éléments à libérer, mais voilà le delete semble libérer tout le tableau.
Concrètement, voici ce que nous avons en mémoire après allocation:
Le tableau commence à 0x003663D0 et se finit à 0x003663EC, pas de problème.0x003663CC fd fd fd fd ýýýý
0x003663D0 00 00 00 00 ....
0x003663D4 d8 63 36 00 Øc6.
0x003663D8 00 00 00 00 ....
0x003663DC e0 63 36 00 àc6.
0x003663E0 00 00 00 00 ....
0x003663E4 e8 63 36 00 èc6.
0x003663E8 00 00 00 00 ....
0x003663EC d0 63 36 00 Ðc6.
0x003663F0 fd fd fd fd ýýýý
Nous déclarons un pointeur sur le 1er élement du tableau, puis nous faisons un delete sur ce pointeur:
où front est un attribut de la classe qui pointe vers le 1er élément du tableau.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 tNode* elt = nodes[0]; delete elt;
Et voila ce que nous avons en mémoire après ces instructions :
Apparemment le tableau a été libéré dans son intégralité !! Comme si nous avions fait un delete[], ce que nous voulions justement éviter.0x003663CC ee fe ee fe îþîþ
0x003663D0 ee fe ee fe îþîþ
0x003663D4 ee fe ee fe îþîþ
0x003663D8 ee fe ee fe îþîþ
0x003663DC ee fe ee fe îþîþ
0x003663E0 ee fe ee fe îþîþ
0x003663E4 ee fe ee fe îþîþ
0x003663E8 ee fe ee fe îþîþ
0x003663EC ee fe ee fe îþîþ
0x003663F0 ee fe ee fe îþîþ
J'aimerais donc savoir si c'est bien le compilo Visual qui ne respecte pas la norme, et qui désalloue jusqu'à rencontrer fd fd fd fd, alors qu'il ne devrait désallouer que l'élément pointé par elt ?
Merci par avance pour votre aide.
Partager