बेहतर जीवन की चाह के लिए, ब्रेज़ेन में रहने वाली दुनिया बहुत ... शैक्षणिक है। यदि आपके कोड को डिज़ाइन और संरचित किया जा सकता है जैसे कि वस्तुओं में बहुत ही जानबूझकर संबंधपरक पदानुक्रम होते हैं, जैसे कि स्वामित्व संबंध कठोर और अनियंत्रित होते हैं, तो कोड एक दिशा में बहता है (उच्च-स्तर से निम्न-स्तर तक), और ऑब्जेक्ट केवल उन निम्न में बात करते हैं पदानुक्रम, तो आप के लिए बहुत जरूरत नहीं मिलेगी shared_ptr
। यह कुछ ऐसा है जो आप उन दुर्लभ अवसरों पर उपयोग करते हैं जहां किसी को नियमों को तोड़ना पड़ता है। लेकिन अन्यथा, आप केवल vector
एस या अन्य डेटा संरचनाओं में सब कुछ चिपका सकते हैं जो मूल्य शब्दार्थ का उपयोग करते हैं, और unique_ptr
उन चीजों के लिए जो आपको अकेले आवंटित करना है।
जबकि वह रहने के लिए एक महान दुनिया है, यह वह नहीं है जो आपको हर समय मिलता है। यदि आप अपने कोड को उस तरह से व्यवस्थित नहीं कर सकते हैं , क्योंकि सिस्टम का डिज़ाइन जो आप बनाने की कोशिश कर रहे हैं, इसका मतलब है कि यह असंभव है (या बस गहराई से अप्रिय), तो आप अपने आप को वस्तुओं के साझा स्वामित्व की आवश्यकता को खोजने जा रहे हैं। ।
इस तरह की व्यवस्था में, नग्न बिंदुओं को पकड़ना ... बिल्कुल खतरनाक नहीं है, लेकिन यह सवाल उठाता है। इसके बारे shared_ptr
में महान बात यह है कि यह वस्तु के जीवनकाल के बारे में उचित वाक्यविन्यास प्रदान करता है । क्या इसे तोड़ा जा सकता है? बेशक। लेकिन लोग const_cast
बातें भी कर सकते हैं; बुनियादी देखभाल और खिलाने के shared_ptr
लिए आवंटित वस्तुओं के लिए जीवन की उचित गुणवत्ता प्रदान करनी चाहिए जिन्हें स्वामित्व साझा किया जाना चाहिए।
फिर, वहाँ weak_ptr
एस, जो अनुपस्थिति में इस्तेमाल नहीं किया जा सकता है shared_ptr
। यदि आपका सिस्टम कठोर रूप से संरचित है, तो आप किसी ऑब्जेक्ट को एक नग्न पॉइंटर को स्टोर कर सकते हैं, इस ज्ञान में सुरक्षित है कि एप्लिकेशन की संरचना यह सुनिश्चित करती है कि ऑब्जेक्ट आपको इंगित करेगा। आप एक फ़ंक्शन को कॉल कर सकते हैं जो कुछ आंतरिक या बाह्य मान के लिए एक पॉइंटर लौटाता है (उदाहरण के लिए एक्स नामक ऑब्जेक्ट ढूंढें)। ठीक से संरचित कोड में, वह फ़ंक्शन केवल आपके लिए उपलब्ध होगा यदि ऑब्जेक्ट का जीवनकाल आपके खुद से अधिक होने की गारंटी हो; इस प्रकार, उस नग्न सूचक को अपनी वस्तु में संग्रहीत करना ठीक है।
चूंकि उस कठोरता को वास्तविक प्रणालियों में प्राप्त करना हमेशा संभव नहीं होता है, इसलिए आपको जीवनकाल सुनिश्चित करने के लिए किसी तरह की आवश्यकता होती है । कभी-कभी, आपको पूर्ण स्वामित्व की आवश्यकता नहीं होती है; कभी-कभी, आपको केवल यह जानने में सक्षम होना चाहिए कि सूचक खराब या अच्छा कब है। यही कारण है कि जहां है weak_ptr
में आता है। ऐसे मामले मैं किया गया है हो सकता है एक का इस्तेमाल किया है unique_ptr
या boost::scoped_ptr
है, लेकिन मैं एक का उपयोग करने के लिए किया था shared_ptr
, क्योंकि मैं विशेष रूप से किसी को एक "अस्थिर" सूचक देने के लिए की जरूरत है। एक सूचक जो जीवन भर अनिश्चित था, और वे उस सूचक को नष्ट होने पर क्वेरी कर सकते थे।
दुनिया की स्थिति के अनिश्चित होने पर जीवित रहने का एक सुरक्षित तरीका।
पॉइंटर को पाने के लिए कुछ फंक्शन कॉल द्वारा किया जा सकता था, इसके बजाय weak_ptr
? हां, लेकिन यह आसानी से टूट सकता है। एक फ़ंक्शन जो एक नग्न पॉइंटर लौटाता है, उसके पास सिंटैक्टिक रूप से यह सुझाव देने का कोई तरीका नहीं है कि उपयोगकर्ता कुछ ऐसा नहीं करता है जो पॉइंटर को दीर्घकालिक बनाता है। किसी को लौटाना shared_ptr
भी किसी के लिए इसे आसानी से संग्रहीत करना आसान बनाता है और संभवतः किसी वस्तु के जीवन-काल को लम्बा खींचता है। एक weak_ptr
जोरदार रिटर्निंग से पता चलता है कि shared_ptr
आपके द्वारा प्राप्त किया lock
जा रहा भंडारण एक ... संदिग्ध विचार है। यह आपको ऐसा करने से नहीं रोकेगा, लेकिन C ++ में कुछ भी आपको कोड तोड़ने से नहीं रोकता है। weak_ptr
प्राकृतिक काम करने से कुछ न्यूनतम प्रतिरोध प्रदान करता है।
अब, यह कहना है कि नहीं है shared_ptr
नहीं किया जा सकता overused ; यह निश्चित रूप से कर सकते हैं। विशेष रूप से पूर्व- unique_ptr
, ऐसे कई मामले थे जहां मैंने सिर्फ boost::shared_ptr
इसलिए इस्तेमाल किया क्योंकि मुझे एक आरएआई पॉइंटर पास करने की आवश्यकता थी या इसे एक सूची में डाल दिया था। चाल शब्दार्थ के बिना और unique_ptr
, boost::shared_ptr
एकमात्र वास्तविक समाधान था।
और आप इसे उन जगहों पर उपयोग कर सकते हैं जहां यह काफी अनावश्यक है। जैसा कि ऊपर कहा गया है, उचित कोड संरचना के कुछ उपयोगों की आवश्यकता को समाप्त कर सकता है shared_ptr
। लेकिन अगर आपके सिस्टम को इस तरह से संरचित नहीं किया जा सकता है और फिर भी इसे करने की आवश्यकता है, तो यह shared_ptr
महत्वपूर्ण उपयोग होगा।