调用join后删除std :: thread?

时间:2015-05-07 01:15:15

标签: c++ multithreading c++11 std stdthread

我有一些代码可以从C ++ 11 std::thread标头中动态分配新的<thread>,如下所示:

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

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

th->join();

由于我动态分配了线程,我是否还需要调用delete th;来释放内存?如果我这样做,我还需要先拨打join()吗?

2 个答案:

答案 0 :(得分:13)

为避免内存泄漏,您需要:join一个正在运行的线程,并确保它被销毁/删除(让它超出堆栈分配std::threads的范围或显式调用delete std::thread*)。

请参阅cppreference中的thread::~thread

  

在以下情况之后,线程对象没有关联的线程(并且可以安全销毁):

     
      
  • 是默认构造的
  •   
  • 它已从
  • 移出   
  • join()被称为
  •   
  • 分离()已被称为
  •   

因此,无法安全地破坏未连接的线程。

join() ed std::thread仍会占用一些记忆。因此,如果它在堆上,则需要确保它已正确释放。

答案 1 :(得分:5)

是的,你必须在销毁线程对象之前调用Foo2。如果调用可加入的join对象的析构函数(即如果joinable返回true),则会调用std::thread。因此,您必须在销毁线程之前调用std::terminate,无论是通过调用delete(对于堆上的线程)还是通过正常销毁它。

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

有关join的更多信息,请参阅here