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