[C++] Libération de mémoire.

Libération de mémoire. [C++] - C++ - Programmation

Marsh Posté le 25-06-2002 à 14:38:43    

Voila j'ai une structure qui comporte des pointeurs vers d'autres structures et ainsi de suite. (pour pouvoir faire des listes chainees de ces structures).
 
La structure principale je voulais la declarer en tant que pointeur, mais deja je sais pas si il vaut mieux utiliser malloc ou new (j'ai toujours utiliser malloc).
 
Enfin pour liberer la memoire, est ce que le delete libere tout, ou est ce qu'il faut que je parcoure toutes les elements des listes pour les freer un a un comme dans une liste chainee normale faite avec un malloc ?
 
Merci :)


---------------
Super.
Reply

Marsh Posté le 25-06-2002 à 14:38:43   

Reply

Marsh Posté le 25-06-2002 à 14:48:04    

si tu fait du C++ utilise new et delete, ces deux opérateurs remplacent malloc et free. Comme avec malloc et free tu doit parcourir toute ta chaine pour libérer chaque mayon (j'aurais pu faire un chouette jeu de mot là... :D )


---------------
Le Tyran
Reply

Marsh Posté le 25-06-2002 à 14:51:35    

boah, c tjs le meme principe, il te faut un delete par new
 
néanmoins si tu utilises les classe du C++ tu peux mettre les delete dans le destructeur
 
par exemple :
 

Code :
  1. class roger
  2. {
  3. public
  4. roger()
  5. {
  6. toto = new char[20];
  7. }
  8. ~roger()
  9. {
  10. delete []toto;
  11. }
  12. private:
  13. char *toto;
  14. };
  15. main()
  16. {
  17. roger *a = new roger;
  18. ....
  19. delete a; //appel au destructeur => destruction automatique de toto
  20. }


vala
 
 
 
 
 
 
 
 

Reply

Marsh Posté le 25-06-2002 à 14:52:51    

Godbout a écrit a écrit :

Voila j'ai une structure qui comporte des pointeurs vers d'autres structures et ainsi de suite. (pour pouvoir faire des listes chainees de ces structures).
 
La structure principale je voulais la declarer en tant que pointeur, mais deja je sais pas si il vaut mieux utiliser malloc ou new (j'ai toujours utiliser malloc).
 
Enfin pour liberer la memoire, est ce que le delete libere tout, ou est ce qu'il faut que je parcoure toutes les elements des listes pour les freer un a un comme dans une liste chainee normale faite avec un malloc ?
 
Merci :)




 
En C++, tu OUBLIES malloc

Reply

Marsh Posté le 25-06-2002 à 14:55:27    

letoII -> ok c'est ce que je voulais savoir merci :)
 
chrisbk -> super le nom de la classe [:fifiz] thx :jap:
 
smaragdus -> pkoi :??:. Je fais du C++ (enfin je crois :D), mais au niveau des listes chainees j'ai toujours fait avec du malloc.


---------------
Super.
Reply

Marsh Posté le 25-06-2002 à 14:56:37    

Godbout a écrit a écrit :

letoII -> ok c'est ce que je voulais savoir merci :)
 
chrisbk -> super le nom de la classe [:fifiz] thx :jap:
 
smaragdus -> pkoi :??:. Je fais du C++ (enfin je crois :D), mais au niveau des listes chainees j'ai toujours fait avec du malloc.




 
Parce qu'en C++ y a new. Malloc, c'est du C (vade retro)

Reply

Marsh Posté le 25-06-2002 à 15:03:01    

quelle argumentation :jap: :D


---------------
Super.
Reply

Marsh Posté le 25-06-2002 à 15:37:07    

Ben faut savoir ce que tu veux  :sarcastic:  
 
En plus new est plus simple à utiliser.

Reply

Marsh Posté le 25-06-2002 à 15:47:24    

le new standard est souvent codé avec malloc.
 
En fait parfois ca sert tout de meme de reutiliser malloc
en C++ mais pas pour le cas general bien entendu (ne s'en servir que si l'on sait pourquoi on le fait :) ).
 
Smaragdus: C++ est un superset de C (modulo une ou deux differences qui les rendent incompatibles stricto-senso).  
malloc() est utilisé en C certes,  
c'est une fonction de librairie qu'on peut egalement utiliser en C++, comme printf, comme int main(), comme les boucles for,
les switchs, les enums et les goto.
 
LeGreg

Reply

Marsh Posté le 25-06-2002 à 15:49:00    

legreg a écrit a écrit :

le new standard est souvent codé avec malloc.
 
En fait parfois ca sert tout de meme de reutiliser malloc
en C++ mais pas pour le cas general bien entendu (ne s'en servir que si l'on sait pourquoi on le fait :) ).
 
Smaragdus: C++ est un superset de C (modulo une ou deux differences qui les rendent incompatibles stricto-senso).  
malloc() est utilisé en C certes,  
c'est une fonction de librairie qu'on peut egalement utiliser en C++, comme printf, comme int main(), comme les boucles for,
les switchs, les enums et les goto.
 
LeGreg




 
Ouai enfin mieu vaut ne pas mélanger les deux (du style faire un free sur un objet alloé par new par exemple).


---------------
Le Tyran
Reply

Marsh Posté le 25-06-2002 à 15:49:00   

Reply

Marsh Posté le 25-06-2002 à 15:55:53    

legreg a écrit a écrit :

le new standard est souvent codé avec malloc.
 
En fait parfois ca sert tout de meme de reutiliser malloc
en C++ mais pas pour le cas general bien entendu (ne s'en servir que si l'on sait pourquoi on le fait :) ).
 
Smaragdus: C++ est un superset de C (modulo une ou deux differences qui les rendent incompatibles stricto-senso).  
malloc() est utilisé en C certes,  
c'est une fonction de librairie qu'on peut egalement utiliser en C++, comme printf, comme int main(), comme les boucles for,
les switchs, les enums et les goto.

LeGreg




 
 :lol:  
goto ou for sont des mots clé du C/C++
malloc et printf sont des fonctions des biblio

Reply

Marsh Posté le 25-06-2002 à 15:57:31    

yep, et on peut les utiliser en C++, comme .. etc.
 
LeGreg

Reply

Marsh Posté le 25-06-2002 à 15:59:52    

Déjà goto c pas bien en C, alors en C++ :)


---------------
Le Tyran
Reply

Marsh Posté le 25-06-2002 à 16:02:14    

Smaragdus a écrit a écrit :

 
 
En C++, tu OUBLIES malloc




 
 :??:  :??:

Reply

Marsh Posté le 25-06-2002 à 16:10:46    

letoII a écrit a écrit :

 
 
Ouai enfin mieu vaut ne pas mélanger les deux (du style faire un free sur un objet alloé par new par exemple).




 
ou enfin bon quand meme hein :D


---------------
Super.
Reply

Marsh Posté le 25-06-2002 à 16:14:18    

Depuis que j'ai vu des gens faire int a = (int) malloc(sizeof(int)); je me méfie :D


---------------
Le Tyran
Reply

Marsh Posté le 25-06-2002 à 16:15:40    

:ouch: :lol:
 
nan moi c'est plutot du style
 
ptrStruct = (PTRSTRUCT) malloc (sizeof(STRUCT));


---------------
Super.
Reply

Marsh Posté le 25-06-2002 à 19:11:33    

malloc et new sont kif-kif. si tu debuggues les deux avec vc++, tu verras que la même fonction est utilisée pour les deux.
 
MAIS malloc() ne peut pas construire un objet, juste allouer de la mémoire. pareil pour free qui ne peut pas le détruire, juste libérer la mémoire.  
 
new / delete = appel constructeur / destructeur + mise en place de la vtable pour les objets virtuels.
 
malloc / free = alloc / libération d'un bloc de mémoire.
 
donc rien ne t'empêche d'utiliser malloc en c++. mais si tu codes en c++, tu utilises sûrement pas mal d'objets, donc pas mal de new / delete. c'est donc mieux d'utiliser toujours la même façon d'allouer pour être consistant.
 
de plus si tu veux surcharger l'allocation mémoire, pour implémenter par ex un garbage collector, tu surchargeras new et delete en appellant par ex malloc et free. si tu utilises malloc ailleurs dans ta source, tu l'auras dans l'os.
 
//
 
pour ton problème, delete n'efface que ce que tu lui demandes d'effacer. donc un delete d'un objet qui contient des listes n'efface que l'objet, pas les listes. MAIS tu peux écrire un destructeur qui sera appelé lors du delete de l'objet et qui se chargera de tout cleaner.

Reply

Marsh Posté le 25-06-2002 à 19:17:23    

youdontcare a écrit a écrit :

malloc et new sont kif-kif. si tu debuggues les deux avec vc++, tu verras que la même fonction est utilisée pour les deux.
 
MAIS malloc() ne peut pas construire un objet, juste allouer de la mémoire. pareil pour free qui ne peut pas le détruire, juste libérer la mémoire.  
 
new / delete = appel constructeur / destructeur + mise en place de la vtable pour les objets virtuels.
 
malloc / free = alloc / libération d'un bloc de mémoire.
 
donc rien ne t'empêche d'utiliser malloc en c++. mais si tu codes en c++, tu utilises sûrement pas mal d'objets, donc pas mal de new / delete. c'est donc mieux d'utiliser toujours la même façon d'allouer pour être consistant.
 
de plus si tu veux surcharger l'allocation mémoire, pour implémenter par ex un garbage collector, tu surchargeras new et delete en appellant par ex malloc et free. si tu utilises malloc ailleurs dans ta source, tu l'auras dans l'os.
 
//
 
pour ton problème, delete n'efface que ce que tu lui demandes d'effacer. donc un delete d'un objet qui contient des listes n'efface que l'objet, pas les listes. MAIS tu peux écrire un destructeur qui sera appelé lors du delete de l'objet et qui se chargera de tout cleaner.




Ce qui est vrai pour vc++ n'est pas nécessairement vrai pour tout les compilo. Se méfier des généralisations hatives.


---------------
Le Tyran
Reply

Marsh Posté le 25-06-2002 à 19:23:33    

letoII a écrit a écrit :

Ce qui est vrai pour vc++ n'est pas nécessairement vrai pour tout les compilo. Se méfier des généralisations hatives.


bien sûr. le fait est que new et malloc font à la base tous les deux la même chose : allouer un bloc mémoire. new rajoute des services derrière.
 
tu as lu mon message ou tu veux juste pinailler ? :D

Reply

Marsh Posté le 25-06-2002 à 22:42:18    

Deja, pourquoi creer des listes chainees... quand on peut utiliser celles qu'il y a dans le header <list> ?
 
Pour ma part, j'essaye de limiter un max les delete et les delete[]. Plutot:
- j'utilise des <vector>
- j'utilise des smart pointers (www.boost.org) (quelle belle invention les smart pointers) qui liberent automatiquement la memoire (ca marche bien dans la plupart des cas).

Reply

Marsh Posté le 25-06-2002 à 23:21:20    

youdontcare -> merci bien ;)


---------------
Super.
Reply

Marsh Posté le 25-06-2002 à 23:21:41    

fabsk a écrit a écrit :

Deja, pourquoi creer des listes chainees... quand on peut utiliser celles qu'il y a dans le header <list> ?
 
Pour ma part, j'essaye de limiter un max les delete et les delete[]. Plutot:
- j'utilise des <vector>
- j'utilise des smart pointers (www.boost.org) (quelle belle invention les smart pointers) qui liberent automatiquement la memoire (ca marche bien dans la plupart des cas).




 
J'aime bien faire mes propres listes chainees, je vois pas ou est le pb :na:


---------------
Super.
Reply

Marsh Posté le 26-06-2002 à 01:15:09    

Godbout a écrit a écrit :

 
 
J'aime bien faire mes propres listes chainees, je vois pas ou est le pb :na:




 
C CHIANT :O
 
 
tu verra, au bout d'un an de liste chainée toi aussi tu en aura marre et tu useras/abusers des std::list, std::deque et autre std::stack :D

Reply

Marsh Posté le 26-06-2002 à 08:11:14    

youdontcare a écrit a écrit :

bien sûr. le fait est que new et malloc font à la base tous les deux la même chose : allouer un bloc mémoire. new rajoute des services derrière.
 
tu as lu mon message ou tu veux juste pinailler ? :D




je suis daccord avec toi sur le principe mais j'aime bien pinailler :D


---------------
Le Tyran
Reply

Marsh Posté le 26-06-2002 à 08:51:49    

chrisbk a écrit a écrit :

 
 
C CHIANT :O
 
 
tu verra, au bout d'un an de liste chainée toi aussi tu en aura marre et tu useras/abusers des std::list, std::deque et autre std::stack :D




 
Bon ben je fais aller voir ce que ca donne.


---------------
Super.
Reply

Marsh Posté le 26-06-2002 à 09:01:04    

list<T> c'est ca qu'il faut que j'utilise ? :??:


Message édité par godbout le 26-06-2002 à 09:15:02

---------------
Super.
Reply

Marsh Posté le 26-06-2002 à 17:04:40    

Godbout a écrit a écrit :

list<T> c'est ca qu'il faut que j'utilise ? :??:




 
prenons une deque (doit etre une sorte de tableau dynamique, en tout cas c tres pratique) d'entier :

Code :
  1. #include <deque> // note l'absence de .h
  2. std::deque<int> tata;
  3. tata.push_back(2); //ajoute 2 en fin de liste
  4. tata.push_front(1); //ajoute 1 en début de liste
  5. int r = tata[1];
  6. tata[1] = 3;


Message édité par chrisbk le 26-06-2002 à 17:04:55
Reply

Marsh Posté le 27-06-2002 à 08:49:52    

Ok, interessant, j'y jetterai un oeil attentif.


---------------
Super.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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