title: Definitely Lost Memory Leak in C Program
body: <p>Would someone be able to shed light on why Valgrind classifies this program as a "Definitely Lost: 2 bytes in 1 block" memory leak?  I understand that the commented line resolves the issue, but I don't understand the classification. According to Valgrind docs it appears that the memory leak should be classified as "Indirectly Reachable". I am also curious as to why this is even considered a memory leak and would appreciate an explanation. Is it good practice to manually free everything even though the program is terminating at the end of the <code>main</code> function?</p>
  
  <pre><code>#include &lt;stdlib.h&gt;
  
  struct wrapper {
    char *data;
  };
  
  char *strdup(const char *);
  
  struct wrapper *walloc(struct wrapper *root)
  {
    if (root == NULL){
      root = (struct wrapper *) malloc(sizeof(struct wrapper));
      root-&gt;data = strdup("H");
    }
  
    return root;
  }
  
  int main(){
    struct wrapper *root;
  
    root = NULL;
    root = walloc(root);
  
    //free(root-&gt;data);
  
    return 0;
  }
  </code></pre>
  
  <p>Here is the Valgrind output:</p>
  
  <pre><code>$ valgrind --leak-check=full ./leak
  ==26489== Memcheck, a memory error detector
  ==26489== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
  ==26489== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
  ==26489== Command: ./leak
  ==26489==
  ==26489==
  ==26489== HEAP SUMMARY:
  ==26489==     in use at exit: 2 bytes in 1 blocks
  ==26489==   total heap usage: 2 allocs, 1 frees, 1,790 bytes allocated
  ==26489==
  ==26489== 2 bytes in 1 blocks are definitely lost in loss record 1 of 1
  ==26489==    at 0x4C29F90: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
  ==26489==    by 0x4EB79C9: strdup (in /usr/lib/libc-2.20.so)
  ==26489==    by 0x400542: walloc (leak.c:13)
  ==26489==    by 0x400542: main (leak.c:23)
  ==26489==
  ==26489== LEAK SUMMARY:
  ==26489==    definitely lost: 2 bytes in 1 blocks
  ==26489==    indirectly lost: 0 bytes in 0 blocks
  ==26489==      possibly lost: 0 bytes in 0 blocks
  ==26489==    still reachable: 0 bytes in 0 blocks
  ==26489==         suppressed: 0 bytes in 0 blocks
  ==26489==
  ==26489== For counts of detected and suppressed errors, rerun with: -v
  ==26489== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
  </code></pre>