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)
5 Years
Discussion Span
Last Post by Banfa

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 topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.