调用 join 后删除 std::thread?

Delete std::thread after calling join?

我有一些代码可以从 C++11 <thread> header 动态分配一个新的 std::thread,像这样:

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

一段时间后,我打电话加入:

th->join();

既然我动态分配了线程,我还需要调用delete th;来释放内存吗?如果我这样做,我还需要先打电话给 join() 吗?

为了避免内存泄漏,您需要:join 一个 运行 线程,并确保它是 destructed/deleted(让它超出堆栈分配的范围 std::threads 或为 std::thread*).

显式调用 delete

参见 cppreference 中的 thread::~thread

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 join()ed std::thread 仍会占用一些内存。因此,如果它在堆上,您需要确保它被正确释放。

是的,您必须在销毁线程对象之前调用 join。如果调用可连接的 std::thread 对象的析构函数(即如果 joinable returns 为真),它将调用 std::terminate。因此,您必须在销毁线程之前调用 join,无论是通过调用 delete(对于堆上的线程)还是通过正常销毁它。

为了防止内存泄漏,您必须调用 delete,就像任何其他堆分配的变量一样。

有关 std::thread 的更多信息,请参阅 here