impossible de liberer la mémoire - C - Programmation
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.
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 ?
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).
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 :
|
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 :
|
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 :
|
le (void*) retourner par malloc est convertit en char *?
J'ai sûrement rien compri..... du coup
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.
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*
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 ?
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.
Marsh Posté le 10-10-2017 à 21:36:16
Merci pour tout !!!
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+,
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
et de
si vous en avez d'autre je suis preneur ) :
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