Tuesday 15 July 2014

c++ - How to avoid memory leak with shared_ptr? -


निम्नलिखित कोड पर विचार करें।

  boost :: shared_ptr; संरचना बी; संरचना ए {~ ए () {std :: cout & lt; & lt; "~ ए" & lt; & lt; std :: endl; } Share_ptr & lt; B & gt; ख; }; संरचना बी {~ बी () {std :: cout & lt; & lt; "~ बी" & lt; & lt; std :: endl; } Share_ptr & lt; ए & gt; ए; }; Int main () {shared_ptr & lt; A & gt; एक (नया ए); shared_ptr & lt; p & gt; बी (नया बी); ए- & gt; बी = बी; बी- & gt; ए = ए; वापसी 0; }  

कोई आउटपुट नहीं है कोई desctructor कहा जाता है स्मृति रिसाव। मैं हमेशा मानता हूं कि स्मार्ट पॉइंटर स्मृति लीक से बचने में मदद करता है।

अगर मुझे कक्षाओं में क्रॉस-रेफरेंस की आवश्यकता हो तो मुझे क्या करना चाहिए?

यदि आपके पास इस तरह के परिपत्र संदर्भ हैं, तो एक ऑब्जेक्ट को एक दूसरे को रखना चाहिए, न कि shared_ptr

से:

क्योंकि कार्यान्वयन संदर्भ गणना का उपयोग करता है, क्योंकि shared_ptr के उदाहरण चक्रों को पुनः प्राप्त नहीं किया जाएगा। उदाहरण के लिए, यदि मुख्य () एक shared_ptr को a पर रखता है, जो प्रत्यक्ष या अप्रत्यक्ष रूप से shared_ptr को वापस रखता है , का उपयोग संख्या 2 हो जाएगी। मूल shared_ptr का विनाश एक 1. का प्रयोग करें weak_ptr का उपयोग "चक्र तोड़ें"।

लिंक के लिए धन्यवाद, ग्लेन।


No comments:

Post a Comment