Salve,
Sto verificando se la memoria in alcuni codici venga liberata in modo corretto utilizzando il tool valgrind di linux.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int conta( char* t, char* p, char c)
{
unsigned int counter = 0;
while(*p != '\0')
{
if(*p == c)
counter++;
p++;
}
p = t;
return counter;
}
void sottostringhe(char* t, char* p, char c, unsigned int counter)
{
char** s = malloc(counter*sizeof(char*));
for( unsigned int i = 0; i < counter; i++)
{
p = strchr(t, c);
int n = ((p + 1) - t);
s[i] = malloc(( n + 1)*sizeof(char));
memcpy(s[i], t, n);
*(s[i] + n) = '\0';
t = p + 1;
p++;
printf("|%s|", s[i]);
free(s[i]);
}
free(s);
}
int main(void)
{
char* testo = "trentatre trentini entrarono a trento tutti e trentatre "
"trotterellando";
char* p = testo;
char c;
scanf("%c", &c);
unsigned int counter = conta(testo, p, c);
sottostringhe(testo, p, c, counter);
}
Nonostante la funzione free() venga utilizzata per tutti i blocchi allocati precedentemente, una volta usato valgrind:
==16568== in use at exit: 2,282 bytes in 1 blocks
==16568== total heap usage: 21 allocs, 20 frees, 4,544 bytes allocated
==16568==
==16568== 2,282 bytes in 1 blocks are still reachable in loss record 1 of 1
==16568== at 0x483DD99: calloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==16568== by 0x4980871: monstartup (gmon.c:153)
==16568== by 0x1091C0: __gmon_start__ (in /home/hp/Scrivania/programmi/a.out)
==16568== by 0x109015: ??? (in /home/hp/Scrivania/programmi/a.out)
==16568== by 0x1FFEFFFED5: ???
==16568== by 0x109520: __libc_csu_init (in /home/hp/Scrivania/programmi/a.out)
==16568== by 0x488303F: (below main) (libc-start.c:264)
==16568==
==16568== LEAK SUMMARY:
==16568== definitely lost: 0 bytes in 0 blocks
==16568== indirectly lost: 0 bytes in 0 blocks
==16568== possibly lost: 0 bytes in 0 blocks
==16568== still reachable: 2,282 bytes in 1 blocks
==16568== suppressed: 0 bytes in 0 blocks
==16568==
==16568== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Perché un blocco non viene liberato? La cosa strana è che la prima volta che avevo fatto questa verifica non mi dava questo messaggio, , ma diceva che non erano possibili leaks. Qualche chiarimento? Grazie in anticipo.