C ++ स्मृति स्वामित्व के बारे में है - उर्फ स्वामित्व शब्दार्थ ।
यह उस स्मृति को जारी करने के लिए गतिशील रूप से आवंटित स्मृति के एक हिस्से के मालिक की जिम्मेदारी है। तो सवाल वास्तव में स्मृति का मालिक कौन हो जाता है।
C ++ ओनरशिप में प्रलेखित होता है जिस प्रकार से एक रॉ पॉइंटर को इस तरह से एक अच्छे (IMO) C लिपि में लपेटा जाता है। यह बहुत ही दुर्लभ ( दुर्लभ , कभी नहीं ) होता है। यह नहीं बताएं कि स्मृति का मालिक कौन है और इस तरह प्रलेखन के सावधानीपूर्वक पढ़ने के बिना आप यह नहीं बता सकते कि स्वामित्व के लिए कौन जिम्मेदार है)।
इसके विपरीत, एक वर्ग में संग्रहीत कच्चे पॉइंटर्स को देखना दुर्लभ है, प्रत्येक कच्चे पॉइंटर को अपने स्वयं के स्मार्ट पॉइंटर रैपर में संग्रहीत किया जाता है। ( एनबी: यदि आपके पास कोई वस्तु नहीं है, तो आपको इसे संग्रहीत नहीं करना चाहिए क्योंकि आप नहीं जान सकते कि यह कब दायरे से बाहर हो जाएगा और नष्ट हो जाएगा।)
तो सवाल:
- किस प्रकार के स्वामित्व वाले शब्दार्थ लोगों के पार आ गए हैं?
- उन शब्दार्थों को लागू करने के लिए किस मानक वर्ग का उपयोग किया जाता है?
- आप उन्हें किन स्थितियों में उपयोगी पाते हैं?
प्रति उत्तर में 1 प्रकार के शब्दार्थ स्वामित्व रखते हैं ताकि उन्हें व्यक्तिगत रूप से वोट दिया जा सके।
सारांश:
वैचारिक रूप से, स्मार्ट पॉइंटर्स सरल हैं और एक भोली कार्यान्वयन आसान है। मैंने कई लागू किए गए प्रयास देखे हैं, लेकिन हमेशा के लिए उन्हें किसी तरह से तोड़ दिया जाता है जो आकस्मिक उपयोग और उदाहरणों के लिए स्पष्ट नहीं है। इस प्रकार, मैं हमेशा सलाह देता हूं कि किसी लाइब्रेरी से हमेशा अच्छे से परीक्षण किए गए स्मार्ट पॉइंटर्स का उपयोग करें। std::auto_ptr
या बूस्ट स्मार्ट पॉइंटर्स में से एक मेरी सभी जरूरतों को पूरा करता है।
std::auto_ptr<T>
:
एकल व्यक्ति वस्तु का मालिक है। स्वामित्व के हस्तांतरण की अनुमति है।
उपयोग: यह आपको उन इंटरफेस को परिभाषित करने की अनुमति देता है जो स्वामित्व के स्पष्ट हस्तांतरण को दर्शाते हैं।
boost::scoped_ptr<T>
एकल व्यक्ति वस्तु का मालिक है। स्वामित्व के हस्तांतरण की अनुमति नहीं है।
उपयोग: स्पष्ट स्वामित्व दिखाने के लिए उपयोग किया जाता है। ऑब्जेक्ट विध्वंसक या स्पष्ट रूप से रीसेट होने पर नष्ट हो जाएगा।
boost::shared_ptr<T>
( std::tr1::shared_ptr<T>
)
एकाधिक स्वामित्व। यह एक साधारण रेफरेंस काउंटेड पॉइंटर है। जब संदर्भ संख्या शून्य तक पहुंच जाती है, तो वस्तु नष्ट हो जाती है।
उपयोग: जब कोई वस्तु जीवन भर के साथ कई owers हो सकती है जो संकलन समय पर निर्धारित नहीं की जा सकती है।
boost::weak_ptr<T>
:
shared_ptr<T>
उन स्थितियों में उपयोग किया जाता है जहां संकेत का एक चक्र हो सकता है।
उपयोग: चक्रों को बनाए रखने से वस्तुओं को रोकने के लिए उपयोग किया जाता है जब केवल चक्र एक साझा प्रतिधारण बनाए रखता है।
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
क्या इसे रीफ़्रेश किया जा सकता है? मैं इसे बिल्कुल नहीं समझता।
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
। रॉ पॉइंटर्स के पास स्वामित्व शब्दार्थ नहीं है। यदि आप उस स्वामी को नहीं जानते हैं जो आप नहीं जानते हैं कि ऑब्जेक्ट को हटाने के लिए कौन जिम्मेदार है। कई मानक वर्ग हैं जो पॉइंटर्स को लपेटने के लिए उपयोग किए जाते हैं (std :: साझा_ptr, std :: unique_ptr आदि) जो स्वामित्व को परिभाषित करते हैं और इस प्रकार परिभाषित करें कि पॉइंटर को हटाने के लिए कौन जिम्मेदार है।