Valgrind muestra pérdida de memoria para printf y bloques no utilizados

2 minutos de lectura
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
  char *str = malloc(sizeof(char)*5);
  str = strcpy(str, "test");
  printf("%s\n", str);
  free(str);
  return 0;
}

Cuando uso Valgrind en mi Mac (OS X, 10.9.5) recibo el siguiente mensaje:

==77215== HEAP SUMMARY:
==77215==     in use at exit: 29,211 bytes in 374 blocks
==77215==   total heap usage: 451 allocs, 77 frees, 35,160 bytes allocated
==77215== 
==77215== 4,096 bytes in 1 blocks are still reachable in loss record 76 of 76
==77215==    at 0x66CB: malloc (in /usr/local/Cellar/valgrind/3.10.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==77215==    by 0x182855: __smakebuf (in /usr/lib/system/libsystem_c.dylib)
==77215==    by 0x197217: __swsetup (in /usr/lib/system/libsystem_c.dylib)
==77215==    by 0x1B0158: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==77215==    by 0x1B06AF: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==77215==    by 0x187B29: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==77215==    by 0x18596F: printf (in /usr/lib/system/libsystem_c.dylib)
==77215==    by 0x100000F2B: main (test.c:8)
==77215== 
==77215== LEAK SUMMARY:
==77215==    definitely lost: 0 bytes in 0 blocks
==77215==    indirectly lost: 0 bytes in 0 blocks
==77215==      possibly lost: 0 bytes in 0 blocks
==77215==    still reachable: 4,096 bytes in 1 blocks
==77215==         suppressed: 25,115 bytes in 373 blocks
==77215== 
==77215== For counts of detected and suppressed errors, rerun with: -v
==77215== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 15)

Lo hace printf asignar memoria por sí mismo? Si elimino el printf Solo obtengo lo siguiente:

==77237== HEAP SUMMARY:
==77237==     in use at exit: 25,115 bytes in 373 blocks
==77237==   total heap usage: 450 allocs, 77 frees, 31,064 bytes allocated
==77237== 
==77237== LEAK SUMMARY:
==77237==    definitely lost: 0 bytes in 0 blocks
==77237==    indirectly lost: 0 bytes in 0 blocks
==77237==      possibly lost: 0 bytes in 0 blocks
==77237==    still reachable: 0 bytes in 0 blocks
==77237==         suppressed: 25,115 bytes in 373 blocks
==77237== 
==77237== For counts of detected and suppressed errors, rerun with: -v
==77237== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 15)

¿De dónde vienen los 373 bloques?

  • En mi sistema Linux amd64 dice que no hay ninguna fuga.

    – Jay

    16/10/2014 a las 16:45


Valgrind muestra perdida de memoria para printf y bloques no
Alex Reinking

Hasta que el equipo de Valgrind le dé prioridad a OS X, puede asumir con seguridad que no dará los resultados correctos en los sistemas Apple que ejecutan versiones de OS X posteriores a la 10.7.

En mi máquina Mavericks (10.9.5), sigo recibiendo la siguiente advertencia de Valgrind (3.9.0)

WARNING: Support on MacOS 10.8/10.9 is experimental and mostly broken.
WARNING: Expect incorrect results, assertions and crashes.
WARNING: In particular, Memcheck on 32-bit programs will fail to
WARNING: detect any errors associated with heap-allocated data.

Por lo que vale, Valgrind 3.10.0 no muestra fugas en mi instalación de Debian Jessie.

Valgrind muestra perdida de memoria para printf y bloques no
ablando

No te está diciendo que hay una fuga:

==77215== LEAK SUMMARY:
==77215==    definitely lost: 0 bytes in 0 blocks
==77215==    indirectly lost: 0 bytes in 0 blocks
==77215==      possibly lost: 0 bytes in 0 blocks
==77215==    still reachable: 4,096 bytes in 1 blocks
==77215==         suppressed: 25,115 bytes in 373 blocks

te está diciendo que hay un bloque que aún es accesible; si hay o no una fuga depende de su definición de ‘fuga’. Lo que sí significa es que hay un puntero al bloque en alguna parte.

Consulte Fuga todavía alcanzable detectada por Valgrind para obtener más información.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad