2009-09-28 10 views
15

मैं अपनी प्रोग्रामिंग भाषा में शामिल करने के लिए सुविधाओं की तलाश में कचरा संग्रह पर पढ़ रहा हूं और मैं "कमजोर पॉइंटर्स" में आया हूं। here से:कमजोर पॉइंटर्स क्यों उपयोगी हैं?

कमजोर संकेत दिए गए संकेत की तरह हैं, सिवाय इसके कि कमजोर संकेत से संदर्भ को नहीं रोकते हैं कचरा संग्रह, और कमजोर संकेत उनकी वैधता की जाँच की इससे पहले कि वे इस्तेमाल कर रहे हैं होना चाहिए।

कमजोर संकेत कचरा कलेक्टर के साथ बातचीत क्योंकि स्मृति को जिनका वे हवाला देते वास्तव में अभी भी मान्य हो सकता है, लेकिन एक अलग ऑब्जेक्ट वाला की तुलना में यह किया था जब कमजोर सूचक बनाया गया था। इस प्रकार, जब भी कचरा कलेक्टर मेमोरी रीसायकल करता है, तो को यह देखने के लिए जांच करनी चाहिए कि कमजोर पॉइंटर्स हैं, और उन्हें अमान्य के रूप में चिह्नित करें (यह इस तरह के बेवकूफ तरीके से लागू नहीं होना चाहिए)।

मैंने कभी कमजोर पॉइंटर्स के बारे में कभी नहीं सुना है। मैं अपनी भाषा में कई विशेषताओं का समर्थन करना चाहता हूं, लेकिन इस मामले में मैं अपने जीवन के लिए ऐसे मामले के बारे में सोच नहीं सकता जहां यह उपयोगी होगा। कमजोर सूचक का उपयोग करने के लिए क्या होगा?

+0

मुझे पता नहीं है ... शायद अगर आपको केवल अस्थायी रूप से डेटा तक पहुंच की आवश्यकता है, तो कचरा कलेक्टर इसे नियमित रूप से साफ़ कर देगा यदि यह नियमित सूचक था? – mpen

उत्तर

8

एक सामान्य उपयोग केस अतिरिक्त ऑब्जेक्ट विशेषताओं का भंडारण है। मान लें कि आपके पास सदस्यों के एक निश्चित समूह के साथ एक कक्षा है, और, बाहर से, आप और अधिक सदस्यों को जोड़ना चाहते हैं। तो आप एक शब्दकोश वस्तु -> विशेषताओं को बनाते हैं, जहां कुंजी कमजोर संदर्भ हैं। फिर, शब्दकोश कुंजी को कचरा इकट्ठा होने से नहीं रोकता है; ऑब्जेक्ट को हटाने से WeakKeyDictionary (उदा। कॉलबैक के माध्यम से) में मानों को हटाने का भी ट्रिगर होना चाहिए।

+0

इस तरह की विस्तार विधियां सी # में कैसे काम करती हैं? – Imagist

+0

@Imagist: बिल्कुल। –

+6

विस्तार विधियों में जीसी और कमजोर संदर्भों के साथ * बिल्कुल कुछ नहीं * है। –

9

एक वास्तव में बड़ा कैशिंग है। आइए सोचें कि कैसे कैश काम करेगा:

कैश के पीछे विचार स्मृति में ऑब्जेक्ट्स को स्टोर करना है जब तक कि मेमोरी दबाव इतना बड़ा न हो जाए कि कुछ वस्तुओं को धक्का दिया जाना चाहिए (या निश्चित रूप से स्पष्ट रूप से अमान्य हैं)। तो आपकी कैश रिपोजिटरी ऑब्जेक्ट को किसी भी तरह इन ऑब्जेक्ट्स पर रखना चाहिए। कमजोर संदर्भ के माध्यम से उन पर पकड़कर, जब कचरा कलेक्टर चीजों को उपभोग करने की तलाश में जाता है क्योंकि स्मृति कम होती है, तो केवल कमजोर संदर्भ द्वारा संदर्भित वस्तुओं को कचरा संग्रह के लिए उम्मीदवार के रूप में दिखाई देगा। वर्तमान में अन्य कोड द्वारा उपयोग किए जा रहे कैश में आइटमों में कठोर संदर्भ अभी भी सक्रिय होंगे, इसलिए उन वस्तुओं को कचरा संग्रह से संरक्षित किया जाएगा।

ज्यादातर स्थितियों में आप अपनी खुद की कैशिंग तंत्र नहीं चलाएंगे, लेकिन कैश का उपयोग करना आम है। मान लीजिए कि आप एक ऐसी संपत्ति चाहते हैं जो कैश में किसी ऑब्जेक्ट को संदर्भित करे, और वह संपत्ति लंबे समय तक गुंजाइश में रहती है। ऑब्जेक्ट को कैश से लाने के लिए आप पसंद करेंगे, लेकिन यदि यह उपलब्ध नहीं है, तो आप इसे लगातार स्टोरेज से प्राप्त कर सकते हैं। यदि दबाव बहुत अधिक हो जाता है तो आप उस विशेष वस्तु को मेमोरी में रहने के लिए मजबूर नहीं करना चाहते हैं। तो आप उस ऑब्जेक्ट के कमजोर संदर्भ का उपयोग कर सकते हैं, जो आपको लाने की अनुमति देगा यदि यह उपलब्ध है लेकिन इसे कैश से बाहर निकलने की अनुमति भी देता है।

+0

यह बहुत समझ में आता है। धन्यवाद। – Imagist

+0

हालांकि मैं इस पर आसाफ से सहमत हूं; मैंने पहले कैश लागू किए हैं और ऐसा लगता है कि ऐसा करने का एक बेहतर तरीका हो सकता है। – Imagist

+0

@ Immist अधिक परिष्कृत कैश निश्चित रूप से अन्य तरीकों से बनाया जा सकता है। हालांकि, मुझे कई स्थितियां मिली हैं जहां मेरा दूसरा उदाहरण एक बहुत ही मजबूत कैशिंग सिस्टम के साथ बातचीत करते समय काम में आता है। –

-1

कमजोर संदर्भ उदाहरण के लिए कैशिंग परिदृश्यों में उपयोग किए जा सकते हैं - आप कमजोर संदर्भों के माध्यम से डेटा तक पहुंच सकते हैं, लेकिन यदि आप लंबे समय तक डेटा तक नहीं पहुंचते हैं या उच्च मेमोरी दबाव होता है, तो जीसी इसे मुक्त कर सकता है।

+1

-1: फिर, यह उदाहरण ठीक है जब आपको * कमजोर पॉइंटर्स का उपयोग नहीं करना चाहिए। –

+0

मुझे यह नहीं मिला ... यह एक डाउनवोट क्यों मिला, जब इसके ऊपर एक ही जवाब 7 अपवॉट प्राप्त हुआ। –

1

उन वस्तुओं का उपयोग करें जब आप ऑब्जेक्ट्स की कैश की गई सूची रखना चाहते थे, लेकिन ऑब्जेक्ट के "असली" मालिक के साथ किए जाने पर उन ऑब्जेक्ट्स को कचरा इकट्ठा करने से रोकें।

एक वेब ब्राउज़र में एक इतिहास ऑब्जेक्ट हो सकता है जो छवि ऑब्जेक्ट्स के संदर्भ रखता है जो ब्राउजर कहीं और लोड होता है और इतिहास/डिस्क कैश में सहेजा जाता है। वेब ब्राउज़र उन छवियों में से एक को समाप्त कर सकता है (उपयोगकर्ता ने कैश साफ़ किया, कैश टाइमआउट समाप्त हो गया, आदि) लेकिन पृष्ठ में अभी भी संदर्भ/सूचक होगा।यदि पृष्ठ एक कमजोर संदर्भ/सूचक का उपयोग करता है तो ऑब्जेक्ट अपेक्षित के रूप में दूर हो जाएगा और स्मृति कचरा एकत्रित किया जाएगा।

+0

कमजोर पॉइंटर्स का एक वैध उपयोग (मैंने वैध उपयोगों के लिए यह मानदंड बनाया है: "यह एक वैध उपयोग है जब डिज़ाइन उन मामलों से स्पष्ट रूप से अलग करता है जहां वस्तुओं के लिए एक मजबूत सूचक भी नहीं है")। –

3

एक और उदाहरण ... काफी कैशिंग नहीं, लेकिन इसी तरह: मान लीजिए कि एक I/O लाइब्रेरी एक ऑब्जेक्ट प्रदान करती है जो फ़ाइल डिस्क्रिप्टर को लपेटती है और फ़ाइल तक पहुंच की अनुमति देती है। जब ऑब्जेक्ट एकत्र किया जाता है, तो फाइल डिस्क्रिप्टर बंद होता है। यह सभी वर्तमान में खोले गए फाइलों को सूचीबद्ध करने में सक्षम होना चाहता है। यदि आप इस सूची के लिए मजबूत पॉइंटर्स का उपयोग करते हैं, तो फ़ाइलें कभी बंद नहीं होती हैं।

5

यदि आपकी भाषा का कचरा कलेक्टर गोलाकार डेटा संरचनाओं को एकत्र करने में असमर्थ है, तो आप ऐसा करने में सक्षम होने के लिए कमजोर संदर्भों का उपयोग कर सकते हैं। आम तौर पर, यदि आपके पास दो वस्तुएं हैं जिनके संदर्भ एक-दूसरे के संदर्भ हैं, लेकिन किसी अन्य बाहरी वस्तु का उन दोनों का संदर्भ नहीं है, तो वे कचरे के संग्रह के लिए उम्मीदवार होंगे। लेकिन, एक भद्दा कचरा कलेक्टर उन्हें इकट्ठा नहीं करेगा, क्योंकि उनमें एक-दूसरे के संदर्भ होते हैं।

इसे ठीक करने के लिए, आप इसे एक ऑब्जेक्ट को दूसरे के लिए एक मजबूत संदर्भ बनाते हैं, लेकिन दूसरे के पहले के लिए एक कमजोर संदर्भ है। फिर, जब पहली वस्तु का अंतिम बाहरी संदर्भ दूर हो जाता है, तो पहला ऑब्जेक्ट कचरा संग्रह के लिए उम्मीदवार बन जाता है, उसके बाद शीघ्र ही उसके बाद होता है, क्योंकि अब इसका एकमात्र संदर्भ कमजोर है।

+2

यह मेरे लिए एक खराब भाषा डिजाइन पसंद की तरह लगता है। कचरा संग्रह जिसके लिए प्रोग्रामर को अपनी याददाश्त का प्रबंधन करने की आवश्यकता होती है, वह मेरी पुस्तक में ज्यादा मूल्यवान नहीं है। – Imagist

-1

कचरा संग्रह का कारण यह है कि सी जैसी भाषा में जहां स्मृति प्रबंधन पूरी तरह से प्रोग्रामर के स्पष्ट नियंत्रण में है, जब ऑब्जेक्ट स्वामित्व पारित हो जाता है, विशेष रूप से धागे या यहां तक ​​कि कठिन, मेमोरी साझा करने वाली प्रक्रियाओं के बीच, मेमोरी लीक से बचने और लटकने वाले पॉइंटर्स बहुत मुश्किल हो सकते हैं। यदि वह काफी कठिन नहीं थे, तो आपको एक समय में स्मृति में फिट होने की अपेक्षा अधिक वस्तुओं तक पहुंचने की आवश्यकता से निपटना होगा-आपको कुछ वस्तुओं को थोड़ी देर तक मुक्त करने का एक तरीका होना चाहिए ताकि अन्य ऑब्जेक्ट्स स्मृति में हो सकता है।

तो, कुछ भाषाएं (उदाहरण के लिए, पर्ल, लिस्प, जावा) एक ऐसी तंत्र प्रदान करती हैं जहां आप किसी ऑब्जेक्ट का उपयोग करके "केवल" रोक सकते हैं और कचरा कलेक्टर अंततः यह खोज लेगा और ऑब्जेक्ट के लिए उपयोग की गई मेमोरी को मुक्त कर देगा। प्रोग्रामर के बिना यह सही तरीके से करता है कि वे इसे गलत तरीके से प्राप्त कर सकते हैं (हालांकि कई तरह के प्रोग्रामर इसे पेंच कर सकते हैं)।

यदि आप किसी ऑब्जेक्ट के मूल्य की गणना करने के लिए किसी ऑब्जेक्ट तक पहुंचने की संख्या को संकल्पनात्मक रूप से गुणा करते हैं, और ऑब्जेक्ट को आसानी से उपलब्ध नहीं होने या किसी के आकार के द्वारा संभवतः फिर से गुणा करें ऑब्जेक्ट मेमोरी में चारों ओर एक बड़ी वस्तु रखने के बाद से कई छोटी वस्तुओं को चारों ओर रखने से रोक सकता है, आप वस्तुओं को तीन श्रेणियों में वर्गीकृत कर सकते हैं।

कुछ वस्तुएं इतनी महत्वपूर्ण हैं कि आप अपने अस्तित्व को स्पष्ट रूप से प्रबंधित करना चाहते हैं-वे कचरा कलेक्टर द्वारा प्रबंधित नहीं किए जाएंगे या उन्हें स्पष्ट रूप से मुक्त होने तक कभी भी एकत्र नहीं किया जाना चाहिए। कुछ वस्तुएं गणना करने के लिए सस्ते होती हैं, छोटी होती हैं, अक्सर उपयोग नहीं की जाती हैं या समान विशेषताएं होती हैं जो उन्हें किसी भी समय कचरा इकट्ठा करने देती हैं।

तीसरी कक्षा, ऑब्जेक्ट्स जो कि महंगे होने के लिए महंगे हैं लेकिन फिर से कंप्यूम्प्यूट किए जा सकते हैं, कुछ हद तक अक्सर उपयोग किए जाते हैं (संभवत: थोड़े समय के लिए), बड़े आकार के होते हैं, और इसी तरह तीसरे वर्ग होते हैं। आप उन्हें यथासंभव स्मृति में रखना चाहते हैं क्योंकि उन्हें फिर से उपयोग किया जा सकता है, लेकिन आप महत्वपूर्ण वस्तुओं के लिए आवश्यक स्मृति से बाहर नहीं निकलना चाहते हैं। ये कमजोर संदर्भों के लिए उम्मीदवार हैं।

आप इन वस्तुओं को यथासंभव लंबे समय तक रखना चाहते हैं यदि वे महत्वपूर्ण संसाधनों के साथ संघर्ष नहीं कर रहे हैं, लेकिन यदि उन्हें महत्वपूर्ण संसाधन के लिए स्मृति की आवश्यकता होती है तो उन्हें छोड़ दिया जाना चाहिए क्योंकि आवश्यकता होने पर इसे दोबारा दोबारा लगाया जा सकता है। ये टोपी कमजोर पॉइंटर्स हैं।

इसका एक उदाहरण चित्र हो सकता है। मान लें कि आपके पास एक फोटो वेब पेज है जिसमें हजारों चित्र प्रदर्शित होंगे। आपको यह जानने की जरूरत है कि कितने चित्रों को रखना है और शायद आपको सूची प्राप्त करने के लिए डेटाबेस क्वेरी करना है। कुछ हज़ार वस्तुओं की सूची रखने की स्मृति शायद बहुत छोटी है। आप एक बार प्रश्न करना चाहते हैं और इसे चारों ओर रखना चाहते हैं।

एक वेब पेज के एक फलक में, आप केवल एक समय में शारीरिक रूप से कुछ दर्जन चित्र दिखा सकते हैं। आपको उन चित्रों के लिए बिट्स लाने की आवश्यकता नहीं है जिन्हें उपयोगकर्ता नहीं देख सकता है। जब उपयोगकर्ता पृष्ठ को स्क्रॉल करता है, तो आप दृश्यमान चित्रों के लिए वास्तविक बिट एकत्र करेंगे। उन चित्रों को दिखाने के लिए कई मेगाबाइट की आवश्यकता हो सकती है। यदि उपयोगकर्ता कुछ स्क्रॉल स्थितियों के बीच आगे और पीछे स्क्रॉल करता है, तो आप उन मेगाबाइट को बार-बार रीफ्रैच नहीं करना चाहते हैं। लेकिन आप सभी चित्रों को हर समय स्मृति में नहीं रख सकते हैं। तो आप कमजोर पॉइंटर्स का उपयोग करते हैं।

यदि उपयोगकर्ता बस कुछ बार बार-बार चित्रों को देखता है, तो वे कैश में रह सकते हैं और आपको उन्हें रीफ्रैच करने की आवश्यकता नहीं है। लेकिन अगर वे पर्याप्त स्क्रॉल करते हैं, तो आपको कुछ मेमोरी खाली करने की ज़रूरत है ताकि दृश्य चित्रों को लाया जा सके। एक कमजोर संदर्भ के साथ, आप इसका उपयोग करने से ठीक पहले संदर्भ की जांच करें। यदि यह अभी भी मान्य है, तो आप इसका इस्तेमाल करते हैं। यदि ऐसा नहीं है, तो आप इसे प्राप्त करने के लिए महंगी गणना (fetch) बनाते हैं।

+2

बेहतर जवाब प्रदान करने में आपकी मदद करने के लिए बस एक अवलोकन: प्रश्न था "कमजोर पॉइंटर्स क्यों उपयोगी हैं?" नहीं "क्या सब कुछ कैशिंग है और कैसे कमजोर पॉइंटर्स मदद कर सकते हैं?"। बिंदु पर रहने की कोशिश करें, संक्षेप में रहें, और यदि प्रश्न विस्तृत उत्तर मांगता है, तो अपने उत्तर को पढ़ने में आसान बनाने के लिए स्वरूपण मार्कअप का लाभ उठाएं। – Artelius

+1

-1: यह उदाहरण ठीक है जब आपको * कमजोर पॉइंटर्स का उपयोग नहीं करना चाहिए। एकत्रित होने से पहले सभी संसाधनों का उपभोग होने तक जीसी रिसाव नहीं करते हैं। वे बहुत आक्रामक इकट्ठा होते हैं। यदि आप जीसी का उपयोग उन्हें बेदखल करने के लिए करते हैं तो आपकी कैश लाइनें 1ms तक नहीं होने की संभावना है क्योंकि वे अगले gen0 संग्रह में भी जीवित नहीं रहेंगे। –

0

कमजोर संदर्भ होने का एक महत्वपूर्ण कारण यह है कि एक वस्तु एक या एक से अधिक श्रोताओं को जानकारी या घटनाओं के स्रोत को जोड़ने के लिए पाइपलाइन के रूप में कार्य कर सकती है। यदि कोई श्रोताओं नहीं हैं, तो पाइपलाइन पर जानकारी भेजने के लिए कोई कारण नहीं है।

उदाहरण के लिए, एक गणना करने योग्य संग्रह पर विचार करें जो गणना के दौरान अपडेट की अनुमति देता है। संग्रह को किसी भी सक्रिय एन्युमरेटर्स को सूचित करने की आवश्यकता हो सकती है कि इसे बदल दिया गया है, इसलिए उन गणककर्ता स्वयं तदनुसार समायोजित कर सकते हैं। अगर कुछ गणकों को उनके रचनाकारों द्वारा त्याग दिया जाता है, लेकिन संग्रह में उनके लिए मजबूत संदर्भ हैं, तो संग्रहकर्ता मौजूद होने तक उन संख्याओं को मौजूद रहेगा (और अपडेट अधिसूचनाओं को संसाधित करेंगे)। यदि संग्रह स्वयं आवेदन के जीवनकाल के लिए मौजूद होगा, तो उन गणक प्रभावी रूप से स्थायी स्मृति रिसाव बन जाएंगे।

यदि संग्रह में गणनाकर्ताओं के कमजोर संदर्भ हैं, तो इस समस्या को बड़े पैमाने पर हल किया जा सकता है। यदि एक गणक को त्याग दिया जाता है, तो यह कचरा संग्रह के लिए योग्य होगा, भले ही संग्रह में अभी भी कमजोर संदर्भ हो। अगली बार जब संग्रह बदल दिया जाता है, तो यह कमजोर संदर्भों की सूची देख सकता है, जो अभी भी वैध हैं, उनके अपडेट अपडेट कर सकते हैं, और अपनी सूची से हटा सकते हैं जो नहीं हैं।

कुछ अतिरिक्त वस्तुओं के साथ अंतिम रूपकों का उपयोग करके कमजोर संदर्भों के कई प्रभावों को हासिल करना संभव होगा, और ऐसे कार्यान्वयन को कमजोर संदर्भों का उपयोग करने वालों की तुलना में अधिक कुशल बनाना संभव है, लेकिन कई नुकसान हैं और इसे टालना मुश्किल है कीड़े। WeakReference का उपयोग करके सही दृष्टिकोण बनाना बहुत आसान है। दृष्टिकोण अनुकूल रूप से कुशल नहीं हो सकता है, लेकिन यह बुरी तरह विफल नहीं होगा।

0

कमजोर पॉइंटर्स जो भी पॉइंट पॉइंट इंगित करता है उसके लिए उन्हें "जीवन समर्थन" का रूप बनने से रोकता है।

कहें कि आपके पास व्यूपोर्ट क्लास, और 2 यूआई कक्षाएं और विजेट कक्षाओं का एक समूह था। आप चाहते हैं कि आपका यूआई उनके द्वारा बनाए गए विजेटों के जीवनकाल को नियंत्रित करे, इसलिए आपका यूआई साझा किए गए सभी विजेट्स पर साझापटर रखता है। जब तक आपका यूआई ऑब्जेक्ट ज़िंदा रहता है, तब तक कोई भी विजेट जो इसे रीफ्रेंस नहीं करता है, कचरा इकट्ठा किया जाएगा (SharedPtr के लिए धन्यवाद)।

हालांकि, व्यूपोर्ट आपकी कक्षा है जो वास्तव में चित्रकारी करता है, इसलिए आपके यूआई को व्यूपोर्ट को विजेट में एक पॉइंटर पास करने की आवश्यकता होती है ताकि वह उन्हें आकर्षित कर सके। किसी भी कारण से, आप अपनी सक्रिय यूआई कक्षा को दूसरे में बदलना चाहते हैं। आइए दो परिदृश्यों पर विचार करें, जहां यूआई ने व्यूपोर्ट वीकपटर पास किए थे और एक जहां यह शेयरपेटर्स पास करता था (विजेट को इंगित करता था)।

यदि आपने वीकपॉइंटर्स के रूप में सभी विजेट्स को व्यूपोर्ट पास कर दिया था, जैसे ही यूआई क्लास हटा दी गई थी, वहां विजेट्स के लिए कोई और शेयरपॉइंटर्स नहीं होंगे, इसलिए वे कचरे एकत्र होंगे, ऑब्जेक्ट्स के व्यूपोर्ट के संदर्भ नहीं होंगे उन्हें "जीवन समर्थन" पर रखें, जो वही है जो आप चाहते हैं क्योंकि आप अब भी उस यूआई का उपयोग नहीं कर रहे हैं, इसके द्वारा बनाए गए विजेट बहुत कम हैं।

अब, मान लें कि आपने व्यूपोर्ट को एक साझा पॉइंटर पास कर दिया है, तो आप यूआई हटाते हैं, और विजेट कचरा नहीं एकत्रित होते हैं! क्यूं कर? क्योंकि व्यूपोर्ट, जो अभी भी जीवित है, में विजेट्स में साझापटर से भरा एक सरणी (वेक्टर या सूची, जो कुछ भी) है। व्यूपोर्ट प्रभावी रूप से उनके लिए "जीवन समर्थन" का एक रूप बन गया है, भले ही आपने यूआई को हटा दिया हो जो कि किसी अन्य UI ऑब्जेक्ट के लिए विजेट को नियंत्रित कर रहा था।

आम तौर पर, एक भाषा/प्रणाली/ढांचा कचरा तब तक इकट्ठा करेगा जब तक स्मृति में कहीं भी "मजबूत" संदर्भ न हो। कल्पना कीजिए कि सब कुछ सब कुछ के लिए एक मजबूत संदर्भ था, कुछ भी कभी कचरा इकट्ठा नहीं होगा! कभी-कभी आप उस व्यवहार को कभी-कभी चाहते हैं जो आप नहीं करते हैं। यदि आप वीकपीआरआर का उपयोग करते हैं, और ऑब्जेक्ट (केवल वीकपीटर) पर कोई साझा/स्ट्रॉन्गर्स नहीं छोड़ा जाता है, तो ऑब्जेक्ट्स वीकपीआरटी संदर्भों के बावजूद कचरा इकट्ठा किया जाएगा, और कमजोर (होना चाहिए) को पूर्ण (या हटाया गया), या कुछ कुछ)।

फिर, जब आप वीकपीआरटी का उपयोग करते हैं तो आप मूल रूप से उस ऑब्जेक्ट को अनुमति दे रहे हैं जिसे आप डेटा तक पहुंचने में सक्षम होने के लिए भी दे रहे हैं, लेकिन वीकपीआरआर उस ऑब्जेक्ट के कचरे के संग्रह को रोक नहीं पाएगा जो इसे साझा पीआरटी की तरह इंगित करता है होगा। जब आप SharePtr सोचते हैं, तो "जीवन समर्थन", वीकपीआरटी, नहीं "जीवन समर्थन" सोचें। कचरा संग्रह (आमतौर पर) तब तक नहीं होगा जब तक ऑब्जेक्ट में शून्य जीवन समर्थन न हो।