2015-05-07 11 views
6

mam jakiś kod, który dynamicznie przydziela nowy std::thread z nagłówka C++ 11 <thread>, tak:Usunąć std :: thread po wywołaniu join?

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

Jakiś czas później, wzywam dołączyć:

th->join(); 

Odkąd dynamicznie przydzielane wątku, czy muszę też zadzwonić pod numer delete th;, aby zwolnić pamięć? Jeśli tak, czy nadal muszę najpierw zadzwonić pod numer join()?

+2

Myślę, że tak. Ale dlaczego nie używać shared_ptr, skoro używasz C++ 11? –

+0

Nauczyłem się C++, zanim wyszedł C++ 11 i nadal uczę się o wszystkich nowych rzeczach. Nie myślałem, aby używać shared_ptr :) – bobroxsox

+3

lub lepiej, użyj 'std :: unique_ptr', chyba że naprawdę potrzebujesz współwłasności. Wyrzucenie unikalnego właściciela również wyjaśnia, kto jest odpowiedzialny za dołączenie –

Odpowiedz

13

Aby uniknąć wycieków pamięci, trzeba zarówno: join uruchomioną wątek i upewnij się, że jest zniszczone/usunięte (let it go poza zakresem na stos przyznane std::threads lub jawnie wywołać usuwać za std::thread*).

Zobacz thread::~thread w cppreference:

Obiekt wątek nie ma skojarzonego wątek (i jest bezpieczne do zniszczenia) po:

  • było domyślne zbudowane
  • została przeniesiona od
  • join() został nazwany
  • detach() został nazwany

Niezłączony wątek nie może być bezpiecznie zniszczony.

Ed join() ed std::thread nadal będzie zajmować trochę pamięci. Dlatego musisz upewnić się, że jest prawidłowo zwolniony, jeśli znajduje się na stercie.

5

Tak, przed zniszczeniem obiektu z gwintem należy zadzwonić pod numer join. Jeśli zostanie wywołany destruktor dla obiektu std::thread, który można dołączyć (to znaczy, że joinable zwraca wartość true), wywoła on std::terminate. Dlatego przed zniszczeniem wątku musisz zadzwonić pod numer join, wywołując usuwanie (dla wątków na stercie) lub normalnie niszcząc.

Aby zapobiec wyciekowi pamięci, należy wywołać polecenie delete, tak jak w przypadku każdej innej zmiennej przydzielonej sterty.

Aby uzyskać więcej informacji na temat std::thread, zobacz stronę here.

Powiązane problemy