Start New Discussion within our Software Development Community

Hi people. I wonder how I can free the pthreads' allocated memory?

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

#define NUM_OF_THREADS 10

void* print_thread_id(void* tid)
   printf("Greetings from thread %d\n", (*(int*)tid));

int main(int argc, char* argv[])
    pthread_t threads[NUM_OF_THREADS];
    int status, i;
    int* n_thread;

    for(i = 0; i < NUM_OF_THREADS; i++)
      if((n_thread = malloc(sizeof(int))) == NULL)
        return EXIT_FAILURE;   

      *n_thread = i;
      printf("Main here. Creating thread %d\n", i);
       if((status = pthread_create(&threads[i], NULL, print_thread_id, n_thread)) != 0)
          printf("ERROR. Thread error code: %d\n", status);
    return EXIT_SUCCESS;

==11701== LEAK SUMMARY:
==11701==    definitely lost: 0 bytes in 0 blocks
==11701==    indirectly lost: 0 bytes in 0 blocks
==11701==      possibly lost: 2,720 bytes in 10 blocks
==11701==    still reachable: 1,552 bytes in 4 blocks
==11701==         suppressed: 0 bytes in 0 blocks
==11701== Rerun with --leak-check=full to see details of leaked memory
==11701== For counts of detected and suppressed errors, rerun with: -v
==11701== ERROR SUMMARY: 4 errors from 1 contexts (suppressed: 2 from 2)

What you should do is

1 Not free the data at line 31, you can not know that the thread has not finished with it. Test by adding a short sleep in print_thread_id

Then either

2 Use pthread_join to detect when the thread has finished running then free the memory.

or (and my personal choice)

3 Assign ownership of that memory to the thread and free the memory in the thread function itself when the thread has finished with the data

This article has been dead for over six months. Start a new discussion instead.