[Compréhension] opérateurs new et delete[]

opérateurs new et delete[] [Compréhension] - C++ - Programmation

Marsh Posté le 14-03-2004 à 18:05:40    

Je me pose des questions sur le fonctionnement des opérateurs new et delete[].
 
Si je vous donne l'exemple suivant :
 

Code :
  1. // Exemple
  2. char * chaine1 = new char [ 100 ];
  3. char * chaine2 = chaine1;
  4. char * chaine1 = new char [ 150 ];
  5. delete[] chaine2;
  6. delete[] chaine1;
  7. // ...etc


 
Est-ce que le premier delete libère correctement la mémoire (100 char consécutifs) ? Ce type de code n'entraine-t-il vraiment aucune perturbation dans la gestion de la mémoire (segfault/leak) ?
 
Cordialement,
   Xter.


Message édité par xterminhate le 14-03-2004 à 18:07:37
Reply

Marsh Posté le 14-03-2004 à 18:05:40   

Reply

Marsh Posté le 14-03-2004 à 18:09:38    

non aucun probleme
 
 
sauf LES PUTAINS DE BORDEL DE CHAR *
 
std::string :o

Reply

Marsh Posté le 14-03-2004 à 18:12:20    

Merci taz,
 
   J'ai choisi le type char * afin de clarifier l'exemple.
 
   Je n'arrive pas encore à exploiter std::string pour gérer mes histoires de rawbuffer alors j'ai tout recodé. Evidemment, ca plante de partout alors je cherche des explications :(
 
Cordialement,
   Xter.
 

Reply

Marsh Posté le 14-03-2004 à 18:13:55    

c'est quoi tes histoires de rawbuffer ?

Reply

Marsh Posté le 14-03-2004 à 18:21:32    

Pour une application j'ai besoin de gérer en mémoire un simple buffer.
 
Je recherche donc une classe de base qui permet toutes les opérations courantes de std::string (insert, append, erase, size, ...etc) basée sur le type (unsigned char *) ou (void *).
 
Aujourd'hui, j'ai un code plus mal foutu qui reprend l'interface de std::string mais qui semble planter aléatoirement.
 

Code :
  1. class x_RawBuffer
  2. {
  3. public:
  4. x_RawBuffer();
  5. virtual ~x_RawBuffer();
  6. x_RawBuffer( const x_RawBuffer & );
  7. const x_RawBuffer & operator=( const x_RawBuffer & );
  8. const unsigned short GetContentLength() const;
  9. unsigned char * GetContent();
  10. const unsigned char * GetContentConst() const;
  11. void Append( const void *, const unsigned short & );
  12. void Append( const x_RawBuffer & );
  13. void Insert( const void *, const unsigned short & );
  14. void Insert( const x_RawBuffer & );
  15. void Erase( const unsigned short & );
  16. void Clear();
  17. void SetContent( const void *, const unsigned short & );
  18. x_RawBuffer SubContent( const unsigned short &, const unsigned short & ) const;
  19. void SubContent( void *, const unsigned short &, const unsigned short & ) const;
  20. protected:
  21. void Copy( const unsigned char *, unsigned char *, const unsigned short & );
  22. void CopyConst( const unsigned char *, unsigned char *, const unsigned short & ) const;
  23. void Resize( const unsigned short & );
  24. private:
  25. unsigned short nContentLength;
  26. unsigned char * pContent;
  27. };


 
Cordialement,
   Xter.


Message édité par xterminhate le 14-03-2004 à 18:22:04
Reply

Marsh Posté le 14-03-2004 à 18:23:32    

skoi ce bordel ? t'as pensé aux std::vector ?

Reply

Marsh Posté le 14-03-2004 à 18:24:55    

Non, je ne connais pas. Je sens que je vais encore me ridiculiser en public.
 
Je regarde std::vector.
 
Merci,
   Xter.

Reply

Marsh Posté le 14-03-2004 à 20:19:21    

J'ai tout recodé sur la base d'un std::vector et j'ai bcp moins de problèmes d'exécution.
 
Merci taz,
   Xter.

Reply

Marsh Posté le 23-10-2004 à 00:48:18    

juste pour être sure
 

Code :
  1. float *toto = new float[10];
  2. toto = new float[10];


 
c'est une grosse erreur et la première allocation de mémoire est "perdue" vu que je n'ai plus l'adresse ? donc tjrs faire un delete avant de vouloir réutiliser un pointeur pour une nouvelle allocation ?
 
sinon autre chose  
 

Code :
  1. float *toto = new float[1];
  2. float *titi = new float;


 
est-ce équivalent ? sinon quel différence physiquement ? dois-je obligatoirement utiliser delete [] pour toto et delete pour titi ? que se passe t'il lorsqu'on utilise delete sur un tableau dynamique et delete[] sur une seul valeur dynamique.


Message édité par push le 23-10-2004 à 19:36:48
Reply

Marsh Posté le 23-10-2004 à 01:42:53    

push a écrit :

juste pour être sure
 

Code :
  1. float *toto = new float[10];
  2. toto = new float[10];


 
c'est une grosse erreur et la première allocation de mémoire est "perdue" vu que je n'ai plus l'adresse ? donc tjrs faire un delete avant de vouloir réutiliser un pointeur pour une nouvelle allocation ?


 
Ton esprit est très confus..
 
Un pointeur ne se réutilise pas, il est retourné par l'allocation qui va pointer vers l'endroit qu'elle a alloué.
 
Faire new c'est égal à "cherche moi x octets disponible sur le tas, et donne moi un pointeur que je puisse travailler dessus". Faire delete c'est égal à "tu te souviens ces octets que je t'avais demandé d'allouer et dont le pointeur était P ? eh bien je n'en ai plus besoin, donc tu peux le marquer comme libre ou faire ce que tu en veux, je te jure sur la tete de ma mère que je ne toucherai plus aux octets pointés par P".

Reply

Marsh Posté le 23-10-2004 à 01:42:53   

Reply

Marsh Posté le 23-10-2004 à 09:42:30    

LeGreg> bah je pensse pas que ce soit confut, un pointeur c'est surtout qu'une variable qui contient une adresse, donc on peut la réutiliser cette variable pour une nouvelle zone mémoire en changant l'adresse qu'elle contient par un nouveau new qui renverra cette nouvelle adresse.
 
ma question portait juste sur le fait d'être sur de devoir faire un delete explicite avant, que ça ne fonctionnait pas comme un realoc();  
 
voila si je dis des conneries qu'on me corrige..


Message édité par push le 23-10-2004 à 09:43:02
Reply

Marsh Posté le 23-10-2004 à 10:10:58    

push a écrit :

LeGreg> bah je pensse pas que ce soit confut, un pointeur c'est surtout qu'une variable qui contient une adresse, donc on peut la réutiliser cette variable pour une nouvelle zone mémoire  


 
la variable n'est pas le pointeur (la bouteille n'est pas égale à son contenu). le pointeur est la valeur de la variable, valeur qui peut changer (et changer la valeur de la variable ne va pas automagiquement libérer ton pointeur).
 
Le pointeur est invariant. Et il faut le deleter non pas quand tu realloues quelque chose (c'est là où ton esprit est confus..) mais surtout quand tu n'as plus besoin de la chose pointée par le pointeur.  
 
realloc n'existe pas en C++. (enfin il est toujours utilisable comme reliquat du C).
 
Pour les redimensionnements voir le template vector<>, c'est bien plus complet que ce que permet le realloc.

Reply

Marsh Posté le 23-10-2004 à 13:53:54    

LeGreg> ok merci pour les précisions sur contenant/contenu j'avais l'habite de fondre les 2, sinon j'avais bien compris qu'on faisait un delete quand on avait plus besoin de la zone mémoire vers quoi le pointeur pointait, c'était bien suite à une histoire de redimensionnement que je me posais la question.


Message édité par push le 23-10-2004 à 13:55:17
Reply

Marsh Posté le 23-10-2004 à 21:59:03    

je repost ma deuxième question si quelqun passe par la ..
 
 

Code :
  1. float *toto = new float[1];
  2. float *titi = new float;


 
est-ce équivalent ? sinon quel différence physiquement ? dois-je obligatoirement utiliser delete [] pour toto et delete pour titi ? que se passe t'il lorsqu'on utilise delete sur une zone allouée avec new[] et delete[] sur une zone allouée avec new ?
 
edit: pour pas me faire tapper dessus pour utilisation abusive du terme tableau  :o


Message édité par push le 23-10-2004 à 22:05:22
Reply

Sujets relatifs:

Leave a Replay

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