2015-05-07 15 views
6

मैं इस तरह, कुछ कोड है कि गतिशील रूप से एक नया std::thread सी ++ 11 <thread> हैडर से आवंटित करता है:शामिल होने के बाद std :: thread हटाएं?

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

कुछ समय बाद, मैं में शामिल होने के कॉल:

th->join(); 

के बाद से मैं गतिशील आवंटित धागा, क्या मुझे स्मृति मुक्त करने के लिए delete th; पर कॉल करने की भी आवश्यकता है? अगर मैं करता हूं, तो मुझे अभी भी join() पर कॉल करने की आवश्यकता है?

+2

मुझे लगता है कि आप करते हैं। लेकिन जब आप C++ 11 का उपयोग कर रहे हैं तो shared_ptr का उपयोग क्यों न करें? –

+0

सी ++ 11 से पहले सी ++ सीखा था और अभी भी सभी नई चीजों के बारे में सीख रहा हूं। Shared_ptr का उपयोग नहीं करना :) – bobroxsox

+3

या बेहतर, 'std :: unique_ptr' का उपयोग करें, जब तक कि आपको वास्तव में साझा स्वामित्व की आवश्यकता न हो। एक अद्वितीय मालिक को बुनाई से यह भी स्पष्ट हो जाता है कि शामिल होने के लिए कौन जिम्मेदार है –

उत्तर

13

मेमोरी लीक से बचने के लिए, आप करने के लिए दोनों की जरूरत है: join एक चल धागा, और यकीन है कि यह विलुप्त/नष्ट कर दिया गया है (इसके लिए क्षेत्र से बाहर जाने दिया ढेर-आवंटित std::threads या स्पष्ट रूप से std::thread* के लिए हटाना कहते हैं)।

cppreference में thread::~thread देखें:

एक धागा वस्तु एक संबद्ध धागा नहीं है (और नष्ट करने के लिए सुरक्षित है) के बाद:

  • यह था डिफ़ॉल्ट-निर्माण
  • यह ले जाया गया था
  • शामिल हों() को
  • अलग करें() को
  • कहा गया है

इसलिए एक गैर-जुड़े धागे को सुरक्षित रूप से नष्ट नहीं किया जा सकता है।

join() एड std::thread अभी भी कुछ स्मृति पर कब्जा कर लेगा। इसलिए आपको यह सुनिश्चित करने की ज़रूरत है कि यह ढेर पर ठीक से हटा दिया गया हो।

5

हां आपको थ्रेड ऑब्जेक्ट को नष्ट करने से पहले join पर कॉल करना होगा। यदि std::thread ऑब्जेक्ट के लिए विनाशक जो शामिल है (यानी joinable सत्य लौटाता है) कहा जाता है, तो यह std::terminate पर कॉल करेगा। इसलिए, आपको थ्रेड को नष्ट करने से पहले join पर कॉल करना होगा, चाहे हटाना (ढेर पर धागे के लिए) या इसे सामान्य रूप से नष्ट किया जा रहा हो।

मेमोरी रिसाव को रोकने के लिए आपको किसी भी अन्य ढेर आवंटित चर के साथ हटा देना होगा।

std::thread पर अधिक जानकारी के लिए here देखें।

संबंधित मुद्दे