2017-05-30 8 views
1

j'ecrivais un code simple C pour tester une allocation de mémoire et pointeurs:Valgrind montre plus la mémoire allouée que ce qui est en fait

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


    int *randomAlloc(int n) { 
     int *address = NULL, i = 0; 

     address = malloc (n * sizeof(int)); 
     for (i = 0; i < n ; i++){ 
      *(address + i) = i ; 
     } 
     return address; 

    } 

    int main(int argc, char* argv[]) { 

     int *address; 
     int n; 
     printf("Type vector size: "); 
     scanf("%d", &n); 
     address = randomAlloc(n); 

     free(address); 
    } 

Pourtant, pour une raison quelconque quand je type 4 sorties valgrind d'entrée:

==2375== Memcheck, a memory error detector 
    ==2375== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
    ==2375== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info 
    ==2375== Command: ./a.out 
    ==2375== 
    Type vector size: 4 
    ==2375== 
    ==2375== HEAP SUMMARY: 
    ==2375==  in use at exit: 0 bytes in 0 blocks 
    ==2375== total heap usage: 3 allocs, 3 frees, 2,064 bytes allocated 
    ==2375== 
    ==2375== All heap blocks were freed -- no leaks are possible 
    ==2375== 
    ==2375== For counts of detected and suppressed errors, rerun with: -v 
    ==2375== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

Il y a seulement un alloc et un gratuit au code. Comme n = 4, je m'attendrais à allouer 4 * 4 (sizeof (int)) = 16 octets. D'où vient-il?

+0

Tapez '1' ou' 2' ... ce sera toujours le même. La seule chose qui va changer est '2064 octets alloués'. Maintenant, jetez un coup d'oeil et réfléchissez, pourquoi. – Michi

+0

Je ne peux pas reproduire le comportement que vous décrivez. Quand je construis ton code et que je l'exécute sous Valgrind, il rapporte une allocation et une gratuite, comme prévu. –

+0

@JohnBollinger Pas sur mon système (linux mint). si je tape '2' j'ai:' l'utilisation totale de tas: 3 allocs, 3 libère, 2 056 octets alloués' si je tape '3' j'ai: 'utilisation totale de tas: 3 allocs, 3 libère, 2 060 octets alloués'. ... etc. '2,056' =>' 2,060' => '2064' – Michi

Répondre

3

Valgrind conserve la trace de toutes les allocations de mémoire qui se produisent dans votre application, y compris celles effectuées en interne par la bibliothèque C. Il n'est pas (et ne peut pas) être limité aux allocations que vous faites explicitement, car la bibliothèque C peut renvoyer des pointeurs vers la mémoire qu'elle a allouée en interne.

De nombreuses implémentations d'E/S standard alloueront des tampons à utiliser par printf() et/ou scanf(), ce qui explique probablement les nombres que vous voyez.

0

L'exécution de ce code sans scanf ou printf:

int *randomAlloc(int n) { 
     int *address = NULL, i = 0; 

     address = malloc (n * sizeof(int)); 
     for (i = 0; i < n ; i++){ 
      *(address + i) = i ; 
     } 
     return address; 

    } 

    int main(int argc, char* argv[]) { 
     int *address; 
    // int n; 
    // printf("Type vector size: "); 
     address = randomAlloc(10); 

     free(address); 
    } 

Outputed sur valgrind que la mémoire allouée explicitement. Printf et scanf étaient définitivement la raison de ces allocs supplémentaires.