सी ++ 03
std::auto_ptr
- शायद पहले ड्राफ्ट सिंड्रोम से पीड़ित मूल में से एक केवल सीमित कचरा संग्रह की सुविधा प्रदान करता है। पहला नकारात्मक पक्ष यह है कि यह delete
नष्ट हो जाने पर उन्हें आबंटित वस्तुओं को रखने के लिए अस्वीकार्य बनाता है ( new[]
)। यह पॉइंटर का स्वामित्व लेता है इसलिए दो ऑटो पॉइंटर्स में समान ऑब्जेक्ट नहीं होना चाहिए। असाइनमेंट स्वामित्व हस्तांतरित कर देगा और रिवॉल्यू ऑटो पॉइंटर को नल पॉइंटर में रीसेट कर देगा । जो शायद सबसे खराब दोष की ओर जाता है; नकल करने में असमर्थता के कारण वे एसटीएल कंटेनरों के भीतर उपयोग नहीं किए जा सकते हैं। किसी भी उपयोग के मामले में अंतिम झटका वे सी ++ के अगले मानक में पदावनत किए जाने के लिए निर्धारित हैं।
std::auto_ptr_ref
- यह एक स्मार्ट पॉइंटर नहीं है यह वास्तव में एक डिज़ाइन विवरण है जिसका उपयोग std::auto_ptr
कुछ स्थितियों में नकल और असाइनमेंट की अनुमति देने के लिए किया जाता है। विशेष रूप से इसका उपयोग एक नॉन-कास्ट std::auto_ptr
को एक लैवल्यू में परिवर्तित करने के लिए किया जा सकता है, जिसे कॉल्विन-गिबन्स चाल का भी उपयोग किया जाता है, जिसे एक मूव कंस्ट्रक्टर के रूप में जाना जाता है। स्वामित्व स्थानांतरित करने के लिए ।
इसके विपरीत, std::auto_ptr
वास्तव में स्वचालित कचरा संग्रहण के लिए एक सामान्य उद्देश्य स्मार्ट पॉइंटर के रूप में उपयोग करने का वास्तव में इरादा नहीं था। मेरी ज्यादातर सीमित समझ और धारणाएं ऑटो के लिए हर्ब सटर के प्रभावी उपयोग पर आधारित हैं और मैं इसे नियमित रूप से उपयोग करता हूं, हालांकि हमेशा सबसे अनुकूलित तरीके से नहीं।
सी ++ 11
std::unique_ptr
- यह हमारा दोस्त है जो इसकी जगह ले std::auto_ptr
लेगा और इसकी कमजोरियों को ठीक करने के लिए महत्वपूर्ण सुधारों को छोड़कर यह समान होगाstd::auto_ptr
जैसे कि ऐरे के साथ काम करने , प्राइवेट कॉपी कंस्ट्रक्टर के माध्यम से लैवल्यू प्रोटेक्शन, एसटीएल कंटेनर और एल्गोरिदम आदि के साथ प्रयोग करने योग्य होने के नाते, क्योंकि यह ओवरहेड है। और स्मृति पदचिह्न सीमित हैं यह प्रतिस्थापित करने के लिए एक आदर्श उम्मीदवार है, या शायद अधिक उपयुक्त रूप से मालिक, कच्चे संकेत के रूप में वर्णित है। जैसा कि "अद्वितीय" का तात्पर्य है, पिछले की तरह ही सूचक का केवल एक मालिक है std::auto_ptr
।
std::shared_ptr
- मेरा मानना है कि यह TR1 और पर आधारित है boost::shared_ptr
लेकिन इसमें एलियासिंग और पॉइंटर अंकगणित को भी शामिल करने के लिए सुधार किया गया है। संक्षेप में, यह एक डायनामिक रूप से आवंटित ऑब्जेक्ट के आसपास गिने हुए स्मार्ट पॉइंटर को संदर्भित करता है। जैसा कि "साझा" का अर्थ है कि सूचक एक से अधिक साझा सूचक के स्वामित्व में हो सकता है जब अंतिम साझा सूचक का अंतिम संदर्भ कार्यक्षेत्र से बाहर हो जाता है तो वस्तु को उचित रूप से हटा दिया जाएगा। ये थ्रेड सुरक्षित भी हैं और अधिकांश मामलों में अपूर्ण प्रकारों को संभाल सकते हैं। डिफ़ॉल्ट आवंटनकर्ता का उपयोग करके एक ढेर आवंटन के साथ std::make_shared
कुशलतापूर्वक निर्माण करने के लिए इस्तेमाल किया जा सकता है std::shared_ptr
।
std::weak_ptr
- इसी तरह TR1 और boost::weak_ptr
। यह एक के स्वामित्व वाली वस्तु का संदर्भ है std::shared_ptr
और इसलिए std::shared_ptr
संदर्भ की संख्या शून्य हो जाने पर वस्तु को हटाने से नहीं रोका जा सकता है। कच्चे पॉइंटर तक पहुंच प्राप्त करने के लिए, आपको पहले std::shared_ptr
कॉल करके एक्सेस करने की आवश्यकता lock
होगी जो कि एक खाली वापस आ जाएगी std::shared_ptr
यदि स्वामित्व वाले पॉइंटर की समय सीमा समाप्त हो गई है और पहले से ही नष्ट हो गई है। यह कई स्मार्ट पॉइंटर्स का उपयोग करते समय अनिश्चितकालीन हैंगिंग रेफरेंस काउंट्स से बचने के लिए मुख्य रूप से उपयोगी है।
बढ़ावा
boost::shared_ptr
- संभवतः सबसे अलग परिदृश्यों (एसटीएल, पीआईएमपीएल, आरएआईआई, आदि) में उपयोग करने के लिए सबसे आसान यह एक साझा संदर्भित स्मार्ट पॉइंटर है। मैंने कुछ स्थितियों में प्रदर्शन और ओवरहेड के बारे में कुछ शिकायतें सुनी हैं, लेकिन मुझे उन्हें अनदेखा करना चाहिए क्योंकि मुझे याद नहीं है कि तर्क क्या था। जाहिरा तौर पर यह एक लंबित मानक C ++ ऑब्जेक्ट बनने के लिए पर्याप्त लोकप्रिय था और स्मार्ट पॉइंटर्स के बारे में मानक पर कोई कमियां दिमाग में नहीं आती हैं।
boost::weak_ptr
- std::weak_ptr
इस कार्यान्वयन के आधार पर पिछले विवरण की तरह , यह गैर-मालिकाना संदर्भ को अनुमति देता है boost::shared_ptr
। आप आश्चर्यजनक रूप से फोन नहीं करते हैंlock()
से "मजबूत" साझा सूचक तक पहुंचने के लिए करते हैं और यह सुनिश्चित करने के लिए जांचना चाहिए कि यह वैध है क्योंकि यह पहले ही नष्ट हो सकता था। बस यह सुनिश्चित करें कि साझा किए गए पॉइंटर को वापस स्टोर न करें और इसे जल्द से जल्द स्कोप से बाहर जाने दें, अन्यथा आप इसके साथ कर रहे हैं अन्यथा आप चक्रीय संदर्भ समस्या पर वापस आ गए हैं जहां आपका संदर्भ मायने रखता है और ऑब्जेक्ट्स नष्ट नहीं होंगे।
boost::scoped_ptr
- यह एक साधारण स्मार्ट पॉइंटर क्लास है जिसमें थोड़ा ओवरहेड संभवत: बेहतर प्रदर्शन के विकल्प के लिए डिज़ाइन किया गया है boost::shared_ptr
जब उपयोग करने योग्य है। यह std::auto_ptr
विशेष रूप से इस तथ्य से तुलनीय है कि इसे एसटीएल कंटेनर के तत्व के रूप में या एक ही वस्तु के लिए कई बिंदुओं के साथ सुरक्षित रूप से उपयोग नहीं किया जा सकता है।
boost::intrusive_ptr
- मैंने इसका उपयोग कभी नहीं किया है, लेकिन अपनी समझ से इसे तब उपयोग करने के लिए डिज़ाइन किया गया है जब आप अपने स्मार्ट पॉइंटर संगत क्लासेस बना रहे हैं। आपको अपने आप को गिनते हुए संदर्भ को लागू करने की आवश्यकता है, आपको कुछ तरीकों को लागू करने की भी आवश्यकता होगी यदि आप चाहते हैं कि आपकी कक्षा सामान्य हो, इसके अलावा आपको अपनी स्वयं की थ्रेड सुरक्षा को लागू करना होगा। प्लस साइड पर यह संभवतः आपको चुनने और चुनने का सबसे कस्टम तरीका देता है कि आप कितना या कितना "स्मार्टनेस" चाहते हैं। intrusive_ptr
आम तौर पर अधिक कुशल है shared_ptr
क्योंकि यह आपको प्रति वस्तु एक ही आवंटन करने की अनुमति देता है। (धन्यवाद अरविद)
boost::shared_array
- यह boost::shared_ptr
सरणियों के लिए है। मूल रूप new []
से operator[]
, और निश्चित रूप delete []
से बेक किया जाता है। इसका उपयोग एसटीएल कंटेनरों में किया जा सकता है और जहाँ तक मुझे पता है कि सब कुछ boost:shared_ptr
करता है, हालांकि आप boost::weak_ptr
इनका उपयोग नहीं कर सकते । आप हालांकि वैकल्पिक रूप से boost::shared_ptr<std::vector<>>
समान कार्यक्षमता के लिए उपयोग कर सकते हैं boost::weak_ptr
और संदर्भ के लिए उपयोग करने की क्षमता हासिल कर सकते हैं ।
boost::scoped_array
- यह boost::scoped_ptr
सरणियों के लिए है। जैसा कि boost::shared_array
सभी आवश्यक सरणी अच्छाई में बेक किया गया है। यह एक गैर-प्रतिलिपि योग्य है और इसलिए एसटीएल कंटेनरों में इसका उपयोग नहीं किया जा सकता है। मैं लगभग कहीं भी पाया आप अपने आप को इस का उपयोग करना चाहते हैं आप शायद उपयोग कर सकते हैं std::vector
। मैंने कभी यह निर्धारित नहीं किया है कि वास्तव में कौन तेज है या कम ओवरहेड है, लेकिन यह स्कॉप्ड सरणी एसटीएल वेक्टर की तुलना में बहुत कम शामिल है। जब आप स्टैक पर आवंटन रखना चाहते हैं तो boost::array
इसके बजाय विचार करें ।
क्यूटी
QPointer
- क्यूटी 4.0 में पेश किया गया यह एक "कमजोर" स्मार्ट पॉइंटर है जो केवल QObject
और व्युत्पन्न वर्गों के साथ काम करता है , जो कि क्यूटी फ्रेमवर्क में लगभग सब कुछ है, इसलिए यह वास्तव में एक सीमा नहीं है। हालाँकि ऐसी सीमाएँ हैं कि यह एक "मजबूत" पॉइंटर की आपूर्ति नहीं करता है और यद्यपि आप जाँच कर सकते हैं कि अंतर्निहित वस्तु isNull()
आपके साथ वैध है या नहीं, क्योंकि आप विशेष रूप से बहु-थ्रेडेड परिवेशों में उस चेक को पास करने के बाद अपनी वस्तु को नष्ट कर सकते हैं। Qt लोग इस पदावनत को मानते हैं जो मैं मानता हूं।
QSharedDataPointer
- यह एक "मजबूत" स्मार्ट पॉइंटर संभावित रूप से तुलनीय है, boost::intrusive_ptr
हालांकि इसमें कुछ थ्रेड सेफ्टी हैं, लेकिन इसके लिए आपको रेफरेंस काउंटिंग के तरीकों ( ref
और deref
) को शामिल करना होगा, जिसे आप सबक्लास करके कर सकते हैं QSharedData
। क्यूटी के बहुत से ऑब्जेक्ट्स का उपयोग पर्याप्त विरासत के माध्यम से किया जाता है और सबकुछ सबकुछ करने के लिए इच्छित डिज़ाइन प्रतीत होता है।
QExplicitlySharedDataPointer
- बहुत समान है, QSharedDataPointer
सिवाय इसके कि यह अंतर्निहित रूप से कॉल नहीं करता है detach()
। मैं इस संस्करण को 2.0 के QSharedDataPointer
रूप में नियंत्रित करने के लिए मामूली वृद्धि के रूप में बिल्कुल वैसा ही कहूंगा जब संदर्भ की संख्या शून्य होने के बाद अलग हो जाना विशेष रूप से एक पूरी नई वस्तु के लायक नहीं है।
QSharedPointer
- एटॉमिक रेफरेंस काउंटिंग, थ्रेड सेफ, शार्बल पॉइंटर, कस्टम डिलीट (एरे सपोर्ट), लगता है कि सब कुछ स्मार्ट पॉइंटर होना चाहिए। यह वही है जो मैं मुख्य रूप से क्यूटी में एक स्मार्ट पॉइंटर के रूप में उपयोग करता हूं और मुझे यह तुलनात्मक लगता है, boost:shared_ptr
हालांकि संभवतः क्यूटी में कई वस्तुओं की तरह अधिक ओवरहेड है।
QWeakPointer
- क्या तुम एक reoccurring पैटर्न समझ में आता है? बस के रूप में std::weak_ptr
और boost::weak_ptr
यह के साथ संयोजन के रूप में प्रयोग किया जाता है QSharedPointer
जब आपको दो स्मार्ट पॉइंटर्स के बीच संदर्भ की आवश्यकता होती है जो अन्यथा आपकी वस्तुओं को कभी भी नष्ट नहीं किया जाएगा।
QScopedPointer
- यह नाम भी परिचित होना चाहिए और वास्तव boost::scoped_ptr
में साझा और कमजोर संकेत के क्यूटी संस्करणों के विपरीत आधारित था । यह ओवरहेड के बिना एक एकल स्वामी स्मार्ट पॉइंटर प्रदान करने का कार्य करता है, QSharedPointer
जो इसे अनुकूलता, अपवाद सुरक्षित कोड और उन सभी चीजों के लिए अधिक उपयुक्त बनाता है , जिनका आप उपयोग std::auto_ptr
या उपयोग कर सकते हैं boost::scoped_ptr
।