Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1503 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°673352
xterminhat​e
Si vis pacem, para bellum.
Posté le 14-03-2004 à 18:05:40  profilanswer
 

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
mood
Publicité
Posté le 14-03-2004 à 18:05:40  profilanswer
 

n°673355
Taz
bisounours-codeur
Posté le 14-03-2004 à 18:09:38  profilanswer
 

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

n°673358
xterminhat​e
Si vis pacem, para bellum.
Posté le 14-03-2004 à 18:12:20  profilanswer
 

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.
 

n°673360
Taz
bisounours-codeur
Posté le 14-03-2004 à 18:13:55  profilanswer
 

c'est quoi tes histoires de rawbuffer ?

n°673367
xterminhat​e
Si vis pacem, para bellum.
Posté le 14-03-2004 à 18:21:32  profilanswer
 

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
n°673369
Taz
bisounours-codeur
Posté le 14-03-2004 à 18:23:32  profilanswer
 

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

n°673370
xterminhat​e
Si vis pacem, para bellum.
Posté le 14-03-2004 à 18:24:55  profilanswer
 

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

n°673456
xterminhat​e
Si vis pacem, para bellum.
Posté le 14-03-2004 à 20:19:21  profilanswer
 

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.

n°880544
push
/dev/random
Posté le 23-10-2004 à 00:48:18  profilanswer
 

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
n°880572
LeGreg
Posté le 23-10-2004 à 01:42:53  profilanswer
 

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".

mood
Publicité
Posté le 23-10-2004 à 01:42:53  profilanswer
 

n°880600
push
/dev/random
Posté le 23-10-2004 à 09:42:30  profilanswer
 

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
n°880607
LeGreg
Posté le 23-10-2004 à 10:10:58  profilanswer
 

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.

n°880769
push
/dev/random
Posté le 23-10-2004 à 13:53:54  profilanswer
 

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
n°881020
push
/dev/random
Posté le 23-10-2004 à 21:59:03  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Please delete this postCommande Free() et Delete() ca marche quand ca veut?
Problème avec un delete[]Delete de std::vector<string>
[Programmation C] Modulo - pb de comprehension du progProblème de compréhension d' une requête SQL
Analyse de "l'efficacité" d'opérateurs de traitement d'image[analyse] question de compréhension sur un cour de MERISE 2
MySQL - Delete avec une jointure?new et delete
Plus de sujets relatifs à : [Compréhension] opérateurs new et delete[]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR