2015-05-07 3 views
6

Ich habe einige Code, der dynamisch einen neuen std::thread aus dem C++ 11 <thread> Header weist, wie folgt aus:Löschen Sie std :: thread nach dem Aufruf von Join?

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

Einige Zeit später rufe ich beitreten:

th->join(); 

Da ich dynamisch zugewiesen der Thread, muss ich auch delete th; anrufen, um den Speicher freizugeben? Wenn ich das tue, muss ich immer zuerst join() anrufen?

+2

Ich denke, Sie tun. Aber warum nicht shared_ptr verwenden, da Sie C++ 11 verwenden? –

+0

Ich lernte C++, bevor C++ 11 herauskam und lerne immer noch über all die neuen Sachen. Ich dachte nicht, shared_ptr zu verwenden :) – bobroxsox

+3

oder besser, verwenden Sie 'std :: unique_ptr', es sei denn, Sie benötigen wirklich eine gemeinsame Eigentümerschaft. Ein eindeutiger Besitzer macht auch deutlich, wer für den Beitritt verantwortlich ist –

Antwort

13

Speicherlecks zu vermeiden, müssen Sie beide: join einen laufenden Faden, und stellen Sie sicher, dass es zerstört/gelöscht (lassen Sie es für Stapel zugeordnet std::threads den Gültigkeitsbereich verlassen oder explizit für std::thread* löschen nennen).

Siehe thread::~thread in cppreference:

Ein Thread-Objekt nicht ein zugehöriges Gewinde hat (und ist sicher zu zerstören) nach:

  • wurde default-konstruiert
  • es bewegt wurde von
  • join() wurde
  • aufgerufen detach() wurde
  • genannt

Ein nicht gefügtes Gewinde kann daher nicht sicher zerstört werden.

Ein join() ed std::thread wird noch etwas Speicher belegen. Daher müssen Sie sicherstellen, dass es ordnungsgemäß freigegeben ist, wenn es auf dem Heap ist.

5

Ja, Sie müssen join aufrufen, bevor Sie das Thread-Objekt löschen. Wenn der Destruktor für ein std::thread-Objekt, das verbindbar ist (d.h. wenn joinable Wahr zurückgibt), aufgerufen wird, ruft es std::terminate auf. Daher müssen Sie join aufrufen, bevor Sie den Thread löschen, entweder durch Aufrufen von delete (für Threads auf dem Heap) oder durch normale Zerstörung.

Um ein Speicherleck zu vermeiden, müssen Sie wie bei jeder anderen zugewiesenen Heap-Variable delete aufrufen.

Weitere Informationen zu std::thread finden Sie unter here.

Verwandte Themen