title: Still Reachable Leak detected by Valgrind
body: <p>All the functions mentioned in this block are library functions. How can I rectify this memory leak? </p>
  
  <p>It is listed under the "<strong>Still reachable</strong>" category. (There are 4 more, which are very similar, but of varying sizes)</p>
  
  <pre><code> 630 bytes in 1 blocks are still reachable in loss record 5 of 5
      at 0x4004F1B: calloc (vg_replace_malloc.c:418)
      by 0x931CD2: _dl_new_object (dl-object.c:52)
      by 0x92DD36: _dl_map_object_from_fd (dl-load.c:972)
      by 0x92EFB6: _dl_map_object (dl-load.c:2251)
      by 0x939F1B: dl_open_worker (dl-open.c:255)
      by 0x935965: _dl_catch_error (dl-error.c:178)
      by 0x9399C5: _dl_open (dl-open.c:584)
      by 0xA64E31: do_dlopen (dl-libc.c:86)
      by 0x935965: _dl_catch_error (dl-error.c:178)
      by 0xA64FF4: __libc_dlopen_mode (dl-libc.c:47)
      by 0xAE6086: pthread_cancel_init (unwind-forcedunwind.c:53)
      by 0xAE61FC: _Unwind_ForcedUnwind (unwind-forcedunwind.c:126)
  </code></pre>
  
  <p><strong>Catch:</strong> Once I ran my program, it gave no memory leaks, but it had one additional line in the Valgrind output, which wasn't present before:</p>
  
  <blockquote>
    <p>Discarding syms at 0x5296fa0-0x52af438
    in /lib/libgcc_s-4.4.4-20100630.so.1
    due to munmap()</p>
  </blockquote>
  
  <p>If the leak can't be rectified, can someone atleast explain why the munmap() line causes Valgrind to report 0 "still reachable" leaks?</p>
  
  <p><strong>Edit:</strong></p>
  
  <p>Here's a minimal test sample:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;pthread.h&gt;
  
  void *runner(void *param) {
      /* some operations ... */
      pthread_exit(NULL);
  }
  
  int n;
  
  int main(void) {
  
      int i;
      pthread_t *threadIdArray;
  
      n=10; /* for example */
  
      threadIdArray = malloc((n+n-1)*sizeof(pthread_t));  
  
      for(i=0;i&lt;(n+n-1);i++) {
          if( pthread_create(&amp;threadIdArray[i],NULL,runner,NULL) != 0 ) {
              printf("Couldn't create thread %d\n",i);
              exit(1);
          }
      }
  
  
      for(i=0;i&lt;(n+n-1);i++) {
          pthread_join(threadIdArray[i],NULL);
      }
  
      free(threadIdArray);
  
      return(0);
  }
  </code></pre>
  
  <p>Run with:</p>
  
  <pre><code>valgrind -v --leak-check=full --show-reachable=yes ./a.out
  </code></pre>