Liberazione della memoria e leaks

di il
1 risposte

Liberazione della memoria e leaks

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.

1 Risposte

  • Re: Liberazione della memoria e leaks

    Non conosco il tool, ma la calloc non l'hai chiamata e 2282 byte di sicuro non li hai allocati tu con quel programma.

    Inoltre al termine del processo la memoria dovrebbe essere liberata automaticamente negli OS moderni
Devi accedere o registrarti per scrivere nel forum
1 risposte