कई उत्तरों संदर्भ संख्या को संग्रहीत करने के तरीके को संबोधित करते हैं (यह सभी साझा_इंटर के लिए साझा स्मृति में संग्रहीत है जो एक ही देशी सूचक धारण करता है), लेकिन अधिकांश लीक की समस्या को दूर करते हैं।
संदर्भ गिनती पॉइंटर्स के साथ स्मृति को लीक करने का सबसे आसान तरीका चक्र बना रहा है। उदाहरण के तौर पर, एक दोगुनी लिंक्ड सूची जहां सभी पॉइंटर्स साझा_ptr कम से कम दो तत्वों के साथ हटाए जाने की गारंटी नहीं है। यहां तक कि यदि बाहरी पॉइंटर्स मुक्त हो जाते हैं, तो आंतरिक पॉइंटर्स अभी भी गिना जाएगा, और संदर्भ संख्या 0 तक नहीं पहुंच जाएगी। कम से कम, सबसे भयानक कार्यान्वयन के साथ।
चक्र समस्या का सबसे आसान समाधान share_ptr (संदर्भ गिनती पॉइंटर्स) को कमजोर पॉइंटर्स के साथ मिलाकर ऑब्जेक्ट के स्वामित्व को साझा नहीं करता है।
साझा पॉइंटर्स संसाधन (सूचक) और अतिरिक्त संदर्भ_count दोनों जानकारी साझा करेंगे। जब आप कमजोर पॉइंटर्स का उपयोग करते हैं, तो संदर्भ गणना दोगुनी हो जाती है: एक साझा सूचक संदर्भ संख्या और एक कमजोर सूचक संदर्भ गणना होती है। जब भी साझा सूचक गणना 0 तक पहुंच जाती है तब संसाधन जारी किया जाता है, लेकिन संदर्भ कमांड जानकारी तब तक जीवित रहती है जब तक कि अंतिम कमजोर सूचक जारी नहीं किया जाता है।
दोगुनी लिंक्ड सूची में, बाहरी संदर्भ एक साझा_प्टर में आयोजित किया जाता है, जबकि आंतरिक लिंक केवल weak_ptr होते हैं। जब भी कोई बाहरी संदर्भ नहीं है (shared_ptr) सूची के तत्व जारी किए जाते हैं, कमजोर संदर्भों को हटाते हैं। अंत में सभी कमजोर संदर्भ हटा दिए गए हैं और प्रत्येक संसाधन के लिए अंतिम कमजोर पॉइंटर संदर्भ_count जानकारी को मुक्त करता है।
उपर्युक्त पाठ की तुलना में यह कम भ्रमित है ... मैं बाद में पुनः प्रयास करूंगा।
स्रोत
2009-04-07 13:43:51
यह सबसे सही जवाब है। –
लिंक-सूची दृष्टिकोण अतिरिक्त आवंटन से बचाता है, लेकिन वैश्विक म्यूटेक्स के बिना "थ्रेड-सुरक्षित" बनाना बहुत मुश्किल है। ("थ्रेड-सुरक्षित" जैसे "कच्चे सूचक के रूप में थ्रेड-सुरक्षित" के रूप में) – curiousguy
यदि आप 'make_shared' का उपयोग करते हैं, तो यह आवंटित ऑब्जेक्ट और इंस्टेंस काउंटर को स्मृति के एक ब्लॉक में डालकर अतिरिक्त आवंटन से भी बचा सकता है। – Ferruccio