Dans mon code, j'ai plusieurs pointeurs vers des pointeurs (par exemple des variables float **), et il semble que des problèmes se posent pour libérer leur mémoire afin de ne pas causer de fuites de mémoire. Voici le code que je l'ai écrit:C libérant le pointeur sur le pointeur
float *one, **part1, **part2;
one = malloc(sizeof(&one) * nx * nx);
part1 = malloc(sizeof(&part1) * nx);
if(one == NULL || part1 == NULL) {
printf("Memory error.\n");
exit(2);
}
for(k = 0; k < nx; k++)
part1[k] = &one[k * nx];
one = malloc(sizeof(&one) * nx * nx);
part2 = malloc(sizeof(&part2) * nx);
if(one == NULL || part2 == NULL) {
printf("Memory error.\n");
exit(2);
}
for(k = 0; k < nx; k++)
part2[k] = &one[k * nx];
... (Other code here)
for(k = 0; k < nx; k++) {
free(part1[k]);
free(part2[k]);
}
free(one);
free(part1);
free(part2);
Ce code passe par, fait les calculs correctement, mais des erreurs dans la boucle libre. Cela fonctionne pour k = 0, mais en essayant de libérer part1 [1] et part2 [1], cela me donne l'erreur "glibc detected".
Je ne voulais pas faire ça parce que la mémoire ne serait alors pas contiguë, n'est-ce pas? Je crois que cela entraînerait une perte d'efficacité. Évidemment, travailler inefficacement vaut mieux que ne pas travailler du tout, mais j'essayais juste de faire fonctionner ça comme ça. Aussi, je sauvegarde le pointeur sur un dans plus que juste part1 [0], non? Ma première boucle enregistre le pointeur dans part1 [k] car k passe de 0 à nx, c'est pourquoi j'ai essayé de libérer la même quantité de mémoire. – wolfPack88
"Ma première boucle enregistre le pointeur dans la partie 1 [k] lorsque k passe de 0 à nx". Non, vous enregistrez _offsets_ d'un. & un [0] = un. & un [k] = un + k. libre (un) libère toute la masse de la mémoire, comme le serait la liberté (partie 1 [0]); – wnoise
Ah ... c'est logique. Merci pour l'aide. – wolfPack88