Question sur la fonction free() en C

Il paraît que quand on fait un malloc ou calloc il faut faire un free sur les pointeurs sur lesquels on a alloué de la mémoire.
Quand je compile sous Code::blocks et que je teste ça marche bien et tout, mais sur Prologin il compile mais ça fait toujours foirer un des tests. Qqun pourrait-il m'expliquer ce qui se passe là ?

Es tu sûr que l'erreur viens de là ? Qu'est ce qu'il y a écrit ?
Mais oui, le free c'est très important… malloc (memory allocation) te donne un espace mémoire de taille spécifié (si il peut), free permet de rendre cet espace mémoire qui pourra alors être réutiliser (renvoyer par un autre malloc).

Par exemple avec le programme suivant :

#include \<stdlib.h>
#include \<stdio.h>

int main(){
while(1){
void *p=malloc(420000);
if(!p){
puts("OOM");
return 1;
}
free(p);
}
}

Tel qu'il est il ne s’arrêtera pas, car normalement malloc renverra toujours un pointeur valide : d'abord un espace t'est réservé (malloc) puis tu le rends (free), puis tu réserves un autre espace mémoire (qui peut être le même que le précédent)… etc… etc…
Mais si tu supprimes la ligne avec le free, alors tu réserveras de la mémoire sans la libérer, malloc te renverra toujours un espace différent, au bout d'un moment tu n'auras plus de mémoire disponible, malloc te renverra un pointeur nul et le programme affichera OOM et quittera.

Mais à vrai dire ton problème ne viens sûrement pas de là… Et à Prologin (en demi), c'est souvent pas très grave de ne pas libérer la mémoire…

Est-ce que ça marche pareil avec des tableaux 2D ?
Par exemple je veux une matrice d'int je fais :

void function(int nblignes, int nbcolonnes, ...)
{
...
//on crée un tableau de pointeurs...
int** matrix = calloc(sizeof(int*), nblignes);
int i;

//on alloue à chaque ligne
for (i=0 ; i \< nblignes ; i++)
{
matrix[i] = calloc(sizeof(int), nbcolonnes);
}

...
//la fonction bidouille un peu etc...
...

//on libère chaque ligne
for (i=0 ; i \< nblignes ; i++)
{
free(matrix[i]);
}

//on libère le tableau
free(matrix);
}

J'ai revérifié le code de la fonction, rien au milieu qui semble affecter la mémoire (autrement qu'une affectation...). L'exécution sur mon PC est nickel et pourtant dans la plupart des exercices de Prologin où j'essaie le free, y'a une erreur; et quand j'enlève le passage avec les free, ça passe...

Oh mais c'est moche !
Dès que l'on peut (99.99 % du temps), il faut passer en global : initialisé par 0 par défaut, aucun problème de stack (malloc non plus, mais pas pour les variables locales), aucun segfault sur l'allocation/désallocation -> c'est du goude* !

* : professeur de philo™

Fin ça dépend de ce qu'on veut faire. Pour ce qui est des exos d'algos de ce genre, oui. Après, ça représente pas 99,99% des cas de tout le monde =p

Quand on a des problèmes sur le serveur de Prologin, c'est pour des exos d'algo (je ne parle pas de la finale, là c'est normal).

Répondre au sujet

Vous devez vous enregistrer ou vous connecter pour poster des messages.