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

  FORUM HardWare.fr
  Programmation
  C

  impossible de liberer la mémoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

impossible de liberer la mémoire

n°2306451
pourquoi_p​as_hein
non
Posté le 09-10-2017 à 00:24:22  profilanswer
 

Bonjour à tous,
Alors voilà, je crée un tableau de pointeur de la façon suivante ( la seul façon que j'ai trouvé pour créer un tableau de pointeur à partir d'un  

Code :
  1. char**

et de

Code :
  1. malloc

si vous en avez d'autre je suis preneur :) ) :
 

Code :
  1. char ** popo=malloc((4+1)*sizeof(char*));
  2. popo[0]="momo1";
  3. popo[1]="momo2";
  4. popo[2]="momo3";
  5. popo[3]="momo4";


 
Le problème c'est que j'ai chercher 1 à 2 heure comment libérer la mémoire allouer, j'ai essayé pas mal de truc si vous avez une solution ou une explication sur ce que j'aurai pas compris je suis preneur!!!!
Merci d'avoir lu :)


Message édité par pourquoi_pas_hein le 09-10-2017 à 00:27:50
mood
Publicité
Posté le 09-10-2017 à 00:24:22  profilanswer
 

n°2306458
WiiDS
20 titres en GC, 0 abandon, 0 DQ
Posté le 09-10-2017 à 11:14:53  profilanswer
 

Ben ... free(popo) tout simplement.
 
free te permet de libérer la mémoire allouée par malloc.


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
n°2306475
pourquoi_p​as_hein
non
Posté le 09-10-2017 à 21:52:51  profilanswer
 

pff je suis trop bète merci :) Au passage j'ai une autre petite question, je lit partout que la fonction "malloc" réserve un espace mémoire contigue ;or dans le bouquin de Dennis Ritchie  qui est co-créateur du C,  il dit bien que l’espace mémoire géré par malloc n'est pas forcement  contigu Du coup qui à raison ?

n°2306476
rat de com​bat
attention rongeur méchant!
Posté le 09-10-2017 à 23:02:49  profilanswer
 

Tu veux bien donner la citation exacte? (et le titre du livre, tu parles du K&R?) Si tu appelles malloc() plusieurs fois tu peux avoir des "bouts" de mémoire qui ne sont pas forcéments adjacents mais peu importe, par contre si tu réserves X octets en une seule fois (un appel) tu vas bien sûr avoir un "bout" de mémoire contigu / sans "trous". :??:

 

edit: Petite remarque d'ailleurs concernant ton code, si tu fais ceci
>popo[0]="momo1";
popo[0] va pointer vers un "string literal" que tu ne peux pas modifier. Si tu veux le modifier faut d'abord réserver de la place en mémoire puis copier la chaîne vers cet endroit (avec str(n)cpy).


Message édité par rat de combat le 09-10-2017 à 23:04:57
n°2306478
pourquoi_p​as_hein
non
Posté le 09-10-2017 à 23:12:06  profilanswer
 

Le language C
Norme ANSI
2ième Edition
Oui le K&R p185:
"Au lieu d'allouer une taille fixe à la compilation, malloc demandera de l'espace mémoire au système d’exploitation quand il en aura besoin.Puisque d'autres activités du programme pourront également demander de l'espace sans appeler cet allocateur, l'espace géré par malloc ne sera pas forcement contigu. On conservera donc son espace libre sous la forme d'une liste de bloc libre." Ma question: avez-vous un cas pratique ou l'on peut voir ce caractère non contigu ?:)
 
Edit: donc si par exemple je fais

Code :
  1. char ** popo=malloc((4+1)*sizeof(char*));
  2. int i;
  3. for(i=0;i<4;i++)
  4.     popo[i]=malloc((5+1)*sizeof(char*));


 
Rien ne dis à priori que les popo[i] (les adresses) seront contigu en mémoire ?
 
 
 
J'en profite pour poser une autre petite question;
Pour ce code :

Code :
  1. char ** popo=malloc((4+1)*sizeof(char*));


malloc retourne un (void*)  qui sera caster automatiquement dans le type de popo?Du coup un (void*) est caster en char**? ou en char *?
 
et là:

Code :
  1. popo[i]=malloc((5+1)*sizeof(char*));


le (void*) retourner par malloc est convertit en char *?
J'ai sûrement rien compri..... du coup  
 


Message édité par pourquoi_pas_hein le 09-10-2017 à 23:45:56
n°2306484
h3bus
Troll Inside
Posté le 10-10-2017 à 08:29:05  profilanswer
 

Oui, si tu appelles plusieurs fois l'allocation, tes addresses peuvent être non contiguës.

 

À noter que potentiellement, un OS pourrait choisir de couper une unique allocation en plusieurs pages non contiguës. Cependant l'espace alloué sera toujours virtuellement contigu, même si il est physiquement non contigu.


Message édité par h3bus le 10-10-2017 à 08:33:32

---------------
sheep++
n°2306485
h3bus
Troll Inside
Posté le 10-10-2017 à 08:31:58  profilanswer
 

Pour ton typage, un (void*) peut être casté sur tout type de pointeur.
Si tu l'affecte à un char**, ta variable char** garde son type.
Dans ton deuxième cas avec popo[i], c'est un char*


---------------
sheep++
n°2306495
pourquoi_p​as_hein
non
Posté le 10-10-2017 à 13:32:48  profilanswer
 

Merci bcp, pour le *void j'ai compris. Pour le malloc Tu es en train dz me dire qu'il y a deux type de mémoire la virtuel et l'autre. Lorsque je demande l'affichage d'une adresse en c avec l'opérateur "&" c'est bien dela mémoire virutelle qui s'agit ? Si c'est le cas pour résumer : Lors d'un seul  appel de malloc la mémoire virtuelle est  forcement contigue, lors de plusieurs appelle  succésive pas forcement c'es ça ?

n°2306511
h3bus
Troll Inside
Posté le 10-10-2017 à 17:22:36  profilanswer
 

Tu peux ignorer ma digression sur la relation entre mémoire virtuelle et physique, cela ne change rien: du point de vue de ton process, la mémoire allouée par un appel à malloc est contiguë.
 
Pour le reste, tu as bien compris.


---------------
sheep++
n°2306533
pourquoi_p​as_hein
non
Posté le 10-10-2017 à 21:36:16  profilanswer
 

Merci pour tout :) !!!


Message édité par pourquoi_pas_hein le 10-10-2017 à 21:37:38
mood
Publicité
Posté le 10-10-2017 à 21:36:16  profilanswer
 

n°2306554
gilou
Modérateur
Modzilla
Posté le 11-10-2017 à 11:28:41  profilanswer
 

Et pour deux mallocs successifs non contigus, il suffit que tu fasses
a = malloc(N) avec N grand
b = malloc(m) avec m petit
c = malloc(m)  
d = malloc(N)
free(b)
e = malloc(N)
f = malloc(m)
si ton allocateur est un minimum bien foutu, il va réutiliser pour f la place libre laissée par b, et les emplacements mémoires de e et f ne seront pas contigüs.
 
A+,


Message édité par gilou le 11-10-2017 à 11:30:25

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

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

  impossible de liberer la mémoire

 

Sujets relatifs
impossible de rentrer dans le whileConnexion à la base impossible sur 1 PC
suppression de fichier impossible[pgsql] ☑ impossible de se connecter avec nouvel utilisateur
Prestashop installation impossible ![Résolu] [SQLite] Importation impossible fichier .dump > .db
[Résolu] Fuite mémoire détecté par Valgrind[Qt][QML] QObject du C++ vers le QML: gestion mémoire
Concommation mémoire variables phplibération mémoire
Plus de sujets relatifs à : impossible de liberer la mémoire


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