调用 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。
我有一些代码可以从 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*
).
参见 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。