我有一些代码可以从C ++ 11 std::thread
标头中动态分配新的<thread>
,如下所示:
std::thread *th = new thread( /* my args */);
一段时间后,我打电话给加入:
th->join();
由于我动态分配了线程,我是否还需要调用delete th;
来释放内存?如果我这样做,我还需要先拨打join()
吗?
答案 0 :(得分:13)
为避免内存泄漏,您需要:join
一个正在运行的线程,并确保它被销毁/删除(让它超出堆栈分配std::threads
的范围或显式调用delete std::thread*
)。
请参阅cppreference中的thread::~thread:
在以下情况之后,线程对象没有关联的线程(并且可以安全销毁):
- 是默认构造的
- 它已从
移出- join()被称为
- 分离()已被称为
因此,无法安全地破坏未连接的线程。
join()
ed std::thread
仍会占用一些记忆。因此,如果它在堆上,则需要确保它已正确释放。
答案 1 :(得分:5)