C++ : delete d'un char * : quelle est la bonne solution ?

C++ : delete d'un char * : quelle est la bonne solution ? - C++ - Programmation

Marsh Posté le 09-12-2002 à 09:00:45    

Je vois partout deux solutions pour le delete, les 2 compiles et marchent a priori :
 
char * nom = new char[255];
 
delete nom;
 
ou
 
delete [] nom;
 
Est-ce que les 2 sont bonnes et pourquoi ?
Thanks

Reply

Marsh Posté le 09-12-2002 à 09:00:45   

Reply

Marsh Posté le 09-12-2002 à 09:54:16    

Est-ce que la première solution détruit bien l'allocation de tout le tableau et pas juste son premier octet ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 09-12-2002 à 10:05:31    

La bonne solution est bien évidemment la deuxième (delete[] nom;). Par contre il est vrai que certains compilateurs (et notamment Visual) tolèrent les deux écritures et désallouent bien le tableau en entier (et pas juste le premier élément).


---------------
each day I don't die is cheating
Reply

Marsh Posté le 09-12-2002 à 10:18:34    

La syntaxe correcte est la deuxième.
 
La première ne serait valable que dans le cas de l'allocation suivante :
 

Code :
  1. char *nom = new char;


 
Mais si tu alloues un tableau, alors tu dois désallouer l'intégralité du tableau, ce que fait la seconde solution. Comme te le dit antp, la première solution ne te désallouera que le premier octet.


Message édité par Harkonnen le 09-12-2002 à 10:18:57

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 09-12-2002 à 19:39:28    

Citation :

Comme te le dit antp, la première solution ne te désallouera que le premier octet.


 
c'est faux.
 
Quand on a alloue un bloc on ne peut pas le desallouer octet par octet..
 
le delete sans [], desalloue bien la memoire mais par contre risque d'avoir des problemes sur des tableaux d'objets (le constructeur ne sera pas appele pour tous les objets du tableau).
 
de plus je rappelle qu'il est possible de modifier le comportement du new/delete et du new[]/delete[] et que ce simple fait, devrait vous empecher de melanger les versions avec [] et sans [].
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 09-12-2002 à 23:31:58    

legreg a écrit :

Citation :

Comme te le dit antp, la première solution ne te désallouera que le premier octet.


 
...
 
le delete sans [], desalloue bien la memoire mais par contre risque d'avoir des problemes sur des tableaux d'objets (le constructeur ne sera pas appele pour tous les objets du tableau).
...
LeGreg

 
 
tu voulais sans doute dire destructeur. Sinon,  :jap:.

Reply

Marsh Posté le 09-12-2002 à 23:49:21    

shinji a écrit :

Je vois partout deux solutions pour le delete, les 2 compiles et marchent a priori :
 
char * nom = new char[255];
 
delete nom;
 
ou
 
delete [] nom;
 
Est-ce que les 2 sont bonnes et pourquoi ?
Thanks


 
Aucune n'est bonne, il ne faut pas utiliser les char * et il ne faut pas utiliser les array C-like en C++ si possible :D
 
Utilise vector et string et tu ne te poseras plus jamais ce genre de question au final peu constructive.

Reply

Marsh Posté le 09-12-2002 à 23:54:27    

Bon comme la discution est terminée, j'en profite !
 
Bonjour shinji !
 
Qu'est-ce que tu deviens ?
 
Y'a un bail qu'on t'as pas vu  :)


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 10-12-2002 à 02:25:58    

C'est comme ça:

Code :
  1. p= malloc(n)   ; free(p)    ;//ou calloc, realloc
  2. p= new type    ; delete p   ;
  3. p= new type[n] ; delete[] p ;


Il faut impérativement les respecter, il n'y a pas de "oui mais chez moi ça marche si je mélange" qui vaille.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed