我創建了一個new
std :: thread對象,然後detach()
它。線程運行一段任意時間,然後自行終止。由於我使用new
創建了該對象,因此我需要delete
才能釋放其資源?或者線程有效delete
本身終止?分離的std :: thread在終止後是否需要刪除?
如果確實有效delete
本身,如果我明確delete
它終止後會發生什麼壞事?
我創建了一個new
std :: thread對象,然後detach()
它。線程運行一段任意時間,然後自行終止。由於我使用new
創建了該對象,因此我需要delete
才能釋放其資源?或者線程有效delete
本身終止?分離的std :: thread在終止後是否需要刪除?
如果確實有效delete
本身,如果我明確delete
它終止後會發生什麼壞事?
是的,你必須自己去delete
。
一旦你調用std::thread::detach,線程將從線程對象中分離出來,並允許執行獨立繼續,然後線程對象將不再擁有任何線程。因此,線程在終止時不會也不可能完成delete
。
每個使用new
分配的C++中的對象必須使用delete
發佈。
線程是一個「位於操作系統內」(通常)的對象。它使用std::thread
構造函數創建,並與detach()
一起發佈。
對象類std::thread
是一個С++對象,與線程關聯。
所以你必須同時釋放OS對象和C++對象。
Upd。當您創建線程時,OS會在kernelspace內分配內部結構來控制它。有一組屬性與每個線程相關聯,如狀態(正在運行,待處理,正在等待資源),優先級,返回碼等。
謝謝 - 您能否詳細說明「位於OS內」的線程對象是什麼?我猜這與@ DavidSchwartz的評論有關? –
@Stuart Barth更新了答案 –
小心,您使用單詞「it」,有時難以分辨您是否意味着線程本身或std :: thread對象。 –
啓動一個分離線程的好方法:'std :: thread(f,a0,a1,...)detach();'不需要新建它。無需刪除它。沒有機會忘記「分離()」它。沒有機會在你的建設和分離之間拋出異常。 –
@DavidSchwartz不知道我明白 - 爲什麼一個線程和一個std ::線程對象的東西不一樣? –