[compilo Visual 2005] Fonctionnement du delete
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 :
Code:
1 2 3 4 5
| struct tNode
{
T* elt;
tNode* next_elt;
} |
Nous avons ensuite une classe dans laquelle nous allouons au constructeur un tableau de tNode:
Code:
tNode* nodes = new tNode[size_max+1];
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.
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:
Citation:
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 ����
Le tableau commence � 0x003663D0 et se finit � 0x003663EC, pas de probl�me.
Nous d�clarons un pointeur sur le 1er �lement du tableau, puis nous faisons un delete sur ce pointeur:
Code:
1 2
| tNode* elt = nodes[0];
delete elt; |
o� front est un attribut de la classe qui pointe vers le 1er �l�ment du tableau.
Et voila ce que nous avons en m�moire apr�s ces instructions :
Citation:
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 ����
Apparemment le tableau a �t� lib�r� dans son int�gralit� !! Comme si nous avions fait un delete[], ce que nous voulions justement �viter.
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.