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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°165443
godbout
Génial.
Posté le 25-06-2002 à 14:38:43  profilanswer
 

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.
mood
Publicité
Posté le 25-06-2002 à 14:38:43  profilanswer
 

n°165460
LetoII
Le dormeur doit se réveiller
Posté le 25-06-2002 à 14:48:04  profilanswer
 

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
n°165470
chrisbk
-
Posté le 25-06-2002 à 14:51:35  profilanswer
 

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
 
 
 
 
 
 
 
 

n°165471
smaragdus
whores, drugs & J.S. Bach
Posté le 25-06-2002 à 14:52:51  profilanswer
 

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

n°165475
godbout
Génial.
Posté le 25-06-2002 à 14:55:27  profilanswer
 

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.
n°165477
smaragdus
whores, drugs & J.S. Bach
Posté le 25-06-2002 à 14:56:37  profilanswer
 

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)

n°165494
godbout
Génial.
Posté le 25-06-2002 à 15:03:01  profilanswer
 

quelle argumentation :jap: :D


---------------
Super.
n°165530
smaragdus
whores, drugs & J.S. Bach
Posté le 25-06-2002 à 15:37:07  profilanswer
 

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

n°165532
LeGreg
Posté le 25-06-2002 à 15:47:24  profilanswer
 

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

n°165534
LetoII
Le dormeur doit se réveiller
Posté le 25-06-2002 à 15:49:00  profilanswer
 

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
mood
Publicité
Posté le 25-06-2002 à 15:49:00  profilanswer
 

n°165542
smaragdus
whores, drugs & J.S. Bach
Posté le 25-06-2002 à 15:55:53  profilanswer
 

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

n°165543
LeGreg
Posté le 25-06-2002 à 15:57:31  profilanswer
 

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

n°165546
LetoII
Le dormeur doit se réveiller
Posté le 25-06-2002 à 15:59:52  profilanswer
 

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


---------------
Le Tyran
n°165551
hellbilly
free smile
Posté le 25-06-2002 à 16:02:14  profilanswer
 

Smaragdus a écrit a écrit :

 
 
En C++, tu OUBLIES malloc




 
 :??:  :??:

n°165558
godbout
Génial.
Posté le 25-06-2002 à 16:10:46  profilanswer
 

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.
n°165561
LetoII
Le dormeur doit se réveiller
Posté le 25-06-2002 à 16:14:18  profilanswer
 

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


---------------
Le Tyran
n°165562
godbout
Génial.
Posté le 25-06-2002 à 16:15:40  profilanswer
 

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


---------------
Super.
n°165761
youdontcar​e
Posté le 25-06-2002 à 19:11:33  profilanswer
 

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.

n°165767
LetoII
Le dormeur doit se réveiller
Posté le 25-06-2002 à 19:17:23  profilanswer
 

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
n°165768
youdontcar​e
Posté le 25-06-2002 à 19:23:33  profilanswer
 

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

n°165927
fabsk
Posté le 25-06-2002 à 22:42:18  profilanswer
 

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

n°165941
godbout
Génial.
Posté le 25-06-2002 à 23:21:20  profilanswer
 

youdontcare -> merci bien ;)


---------------
Super.
n°165942
godbout
Génial.
Posté le 25-06-2002 à 23:21:41  profilanswer
 

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.
n°165982
chrisbk
-
Posté le 26-06-2002 à 01:15:09  profilanswer
 

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

n°166014
LetoII
Le dormeur doit se réveiller
Posté le 26-06-2002 à 08:11:14  profilanswer
 

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
n°166026
godbout
Génial.
Posté le 26-06-2002 à 08:51:49  profilanswer
 

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.
n°166031
godbout
Génial.
Posté le 26-06-2002 à 09:01:04  profilanswer
 

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


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

---------------
Super.
n°166607
chrisbk
-
Posté le 26-06-2002 à 17:04:40  profilanswer
 

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
n°166870
godbout
Génial.
Posté le 27-06-2002 à 08:49:52  profilanswer
 

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


---------------
Super.
mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
Pb de mémoire sous ExcelTrou de mémoire
capacité mémoire de la carte graphique en OpenGLsoft pour fuites mémoire
comment s'appelle ce composant (trou de memoire inside)re post: Question carte a memoire...
Question carte à mémoire....[Java] Connaître la mémoire utilisée par une classe
[ prog systeme Unix inside !] help !! mémoire partagée, je galère ![C++]Lire qqc à une adresse mémoire précise
Plus de sujets relatifs à : [C++] Libération de mémoire.


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