web-dev-qa-db-ja.com

結合を呼び出した後にstd :: threadを削除しますか?

次のように、C++ 11 _std::thread_ヘッダーから新しい_<thread>_を動的に割り当てるコードがあります。

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

しばらくして、私は参加を呼び出します:

_th->join();
_

スレッドを動的に割り当てたので、メモリを解放するために_delete th;_も呼び出す必要がありますか?その場合でも、最初にjoin()を呼び出す必要がありますか?

13
bobroxsox

はい、スレッドオブジェクトを破棄する前にjoinを呼び出す必要があります。結合可能なstd::threadオブジェクトのデストラクタが呼び出されると(つまり、 joinable がtrueを返す場合)、std::terminateが呼び出されます。したがって、スレッドを破棄する前にjoinを呼び出す必要があります。これは、(ヒープ上のスレッドの場合)deleteを呼び出すか、正常に破棄されるかによって異なります。

メモリリークを防ぐには、他のヒープ割り当て変数と同様に、deleteを呼び出す必要があります。

std::threadの詳細については、 こちら を参照してください。

5
phantom