impossible de liberer la mémoire

impossible de liberer la mémoire - C - Programmation

Marsh Posté le 09-10-2017 à 00:24:22    

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
Reply

Marsh Posté le 09-10-2017 à 00:24:22   

Reply

Marsh Posté le 09-10-2017 à 11:14:53    

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
Reply

Marsh Posté le 09-10-2017 à 21:52:51    

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 ?

Reply

Marsh Posté le 09-10-2017 à 23:02:49    

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
Reply

Marsh Posté le 09-10-2017 à 23:12:06    

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
Reply

Marsh Posté le 10-10-2017 à 08:29:05    

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++
Reply

Marsh Posté le 10-10-2017 à 08:31:58    

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++
Reply

Marsh Posté le 10-10-2017 à 13:32:48    

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 ?

Reply

Marsh Posté le 10-10-2017 à 17:22:36    

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++
Reply

Marsh Posté le 10-10-2017 à 21:36:16    

Merci pour tout :) !!!


Message édité par pourquoi_pas_hein le 10-10-2017 à 21:37:38
Reply

Marsh Posté le 10-10-2017 à 21:36:16   

Reply

Marsh Posté le 11-10-2017 à 11:28:41    

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é!  --
Reply

Sujets relatifs:

Leave a Replay

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