2016-02-04 76 views
3

我創建了一個new std :: thread對象,然後detach()它。線程運行一段任意時間,然後自行終止。由於我使用new創建了該對象,因此我需要delete才能釋放其資源?或者線程有效delete本身終止?分離的std :: thread在終止後是否需要刪除?

如果確實有效delete本身,如果我明確delete它終止後會發生什麼壞事?

+3

小心,您使用單詞「it」,有時難以分辨您是否意味着線程本身或std :: thread對象。 –

+2

啓動一個分離線程的好方法:'std :: thread(f,a0,a1,...)detach();'不需要新建它。無需刪除它。沒有機會忘記「分離()」它。沒有機會在你的建設和分離之間拋出異常。 –

+0

@DavidSchwartz不知道我明白 - 爲什麼一個線程和一個std ::線程對象的東西不一樣? –

回答

6

是的,你必須自己去delete

一旦你調用std::thread::detach,線程將從線程對象中分離出來,並允許執行獨立繼續,然後線程對象將不再擁有任何線程。因此,線程在終止時不會也不可能完成delete

1

每個使用new分配的C++中的對象必須使用delete發佈。

線程是一個「位於操作系統內」(通常)的對象。它使用std::thread構造函數創建,並與detach()一起發佈。

對象類std::thread是一個С++對象,與線程關聯。

所以你必須同時釋放OS對象和C++對象。


Upd。當您創建線程時,OS會在kernelspace內分配內部結構來控制它。有一組屬性與每個線程相關聯,如狀態(正在運行,待處理,正在等待資源),優先級,返回碼等。

+0

謝謝 - 您能否詳細說明「位於OS內」的線程對象是什麼?我猜這與@ DavidSchwartz的評論有關? –

+0

@Stuart Barth更新了答案 –

相關問題