Delete std::thread after calling join?

bobroxsox picture bobroxsox · May 7, 2015 · Viewed 21.9k times · Source

I have some code that dynamically allocates a new std::thread from the C++11 <thread> header, like this:

std::thread *th = new thread( /* my args */);

Some time later, I call join:

th->join();

Since I dynamically allocated the thread, do I also need to call delete th; to free the memory? If I do, do I still need to call join() first?

Answer

EyasSH picture EyasSH · May 7, 2015

To avoid memory leaks, you need to both: join a running thread, and make sure it is destructed/deleted (let it go out of scope for stack-allocated std::threads or explicitly call delete for std::thread*).

See thread::~thread in cppreference:

A thread object does not have an associated thread (and is safe to destroy) after:

  • it was default-constructed
  • it was moved from
  • join() has been called
  • detach() has been called

A non-joined thread, therefore, cannot be safely destructed.

A join()ed std::thread will still occupy some memory. Therefore you need to make sure it is properly deallocated if it is on the heap.