Libération de mémoire. [C++] - C++ - Programmation
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à... )
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 :
|
vala
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
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 thx
smaragdus -> pkoi . Je fais du C++ (enfin je crois ), mais au niveau des listes chainees j'ai toujours fait avec du malloc.
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 thx smaragdus -> pkoi . Je fais du C++ (enfin je crois ), 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)
Marsh Posté le 25-06-2002 à 15:37:07
Ben faut savoir ce que tu veux
En plus new est plus simple à utiliser.
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
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).
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 |
goto ou for sont des mots clé du C/C++
malloc et printf sont des fonctions des biblio
Marsh Posté le 25-06-2002 à 15:57:31
yep, et on peut les utiliser en C++, comme .. etc.
LeGreg
Marsh Posté le 25-06-2002 à 15:59:52
Déjà goto c pas bien en C, alors en C++
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
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
Marsh Posté le 25-06-2002 à 16:15:40
nan moi c'est plutot du style
ptrStruct = (PTRSTRUCT) malloc (sizeof(STRUCT));
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.
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.
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 ?
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).
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
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 |
C CHIANT
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
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 ? |
je suis daccord avec toi sur le principe mais j'aime bien pinailler
Marsh Posté le 26-06-2002 à 08:51:49
chrisbk a écrit a écrit : C CHIANT 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 |
Bon ben je fais aller voir ce que ca donne.
Marsh Posté le 26-06-2002 à 09:01:04
list<T> c'est ca qu'il faut que j'utilise ?
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 :
|
Marsh Posté le 27-06-2002 à 08:49:52
Ok, interessant, j'y jetterai un oeil attentif.
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.