अशक्त संदर्भ: Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|In programming, a reference which does not protect its object from garbage collection}} कंप्यूटर प्रोग्रामिंग...")
 
No edit summary
 
(8 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Short description|In programming, a reference which does not protect its object from garbage collection}}
{{Short description|In programming, a reference which does not protect its object from garbage collection}}
[[कंप्यूटर प्रोग्रामिंग]] में, एक कमजोर संदर्भ एक [[संदर्भ (कंप्यूटर विज्ञान)]] है जो संदर्भित [[वस्तु (कंप्यूटर विज्ञान)]] को [[कचरा संग्रह (कंप्यूटर विज्ञान)]] द्वारा संग्रह से सुरक्षित नहीं करता है, एक मजबूत संदर्भ के विपरीत। कमजोर संदर्भों द्वारा ''केवल'' संदर्भित एक वस्तु - जिसका अर्थ है कि वस्तु तक पहुंचने वाले संदर्भों की प्रत्येक श्रृंखला में लिंक के रूप में कम से कम एक कमजोर संदर्भ शामिल है - इसे ''कमजोर पहुंच योग्य'' माना जाता है और इसे [[अगम्य स्मृति]] के रूप में माना जा सकता है और इसलिए हो सकता है किसी भी समय एकत्र किया जा सकता है। कुछ कचरा-संग्रहित भाषाएं कमजोर संदर्भों के विभिन्न स्तरों को प्रदर्शित करती हैं या उनका समर्थन करती हैं, जैसे सी शार्प (प्रोग्रामिंग भाषा)|सी#, [[जावा (प्रोग्रामिंग भाषा)]], [[लिस्प (प्रोग्रामिंग भाषा)]], [[ OCaml ]], [[पर्ल]], [[पायथन (प्रोग्रामिंग भाषा)]]<ref>[https://docs.python.org/3/library/weakref.html 8.8. weakref — Weak references], The Python Standard Library</ref> और [[PHP]] संस्करण 7.4 के बाद से।<ref>{{Cite web|url=https://www.php.net/manual/en/class.weakreference.php|title = PHP: WeakReference - Manual}}</ref>
[[कंप्यूटर प्रोग्रामिंग]] में, [[संदर्भ (कंप्यूटर विज्ञान)]] होता है जो संदर्भित [[वस्तु (कंप्यूटर विज्ञान)]] को गार्बेज संग्राहक (कंप्यूटर विज्ञान) द्वारा संग्रह से सुरक्षित नहीं करता है, ठोस संदर्भ के विपरीत होता है। वीक संदर्भों द्वारा ''मात्र'' संदर्भित वस्तु जिसका अर्थ है कि वस्तु तक पहुंचने वाले संदर्भों की प्रत्येक श्रृंखला में लिंक के रूप में अल्प से अल्प वीक संदर्भ सम्मिलित है- इसे ''वीक पहुंच योग्य'' माना जाता है और इसे [[अगम्य स्मृति|अगम्य]] के रूप में माना जा सकता है और इसलिए इसे किसी भी समय एकत्र किया जा सकता है। 7.4 संस्करण के पश्चात से कुछ गार्बेज-संग्रहित भाषाएं वीक संदर्भों के विभिन्न स्तरों को प्रदर्शित करती हैं या उनका समर्थन करती हैं, जैसे कि सी, जावा (प्रोग्रामिंग भाषा), लिस्प (प्रोग्रामिंग भाषा), ओ कैमल, [[पर्ल]], पायथन (प्रोग्रामिंग भाषा)<ref>[https://docs.python.org/3/library/weakref.html 8.8. weakref — Weak references], The Python Standard Library</ref> और [[PHP|पीएचपी]] आदि।<ref>{{Cite web|url=https://www.php.net/manual/en/class.weakreference.php|title = PHP: WeakReference - Manual}}</ref>
== उपयोग ==
वीक संदर्भों के कई सामान्य उपयोग हैं। [[संदर्भ गिनती]] गार्बेज संग्रह का उपयोग करते समय, वीक [[संदर्भ चक्र]] में  लिंक के लिए वीक संदर्भ का उपयोग करके संदर्भ चक्र को विभक्त कर सकते हैं। जब किसी के निकट  [[साहचर्य सरणी]] (मैपिंग, हैश मैप) होती है, जिसकी कुंजियाँ (संदर्भ) वस्तुएं होती हैं, उदाहरण के लिए वस्तुओं के बारे में सहायक डेटा रखने के लिए, कुंजियों के लिए वीक संदर्भों का उपयोग करने से वस्तुओं को मात्र कुंजी के रूप में उपयोग करने के कारण जीवित रखने से बचा जाता है। जब किसी के निकट वस्तु होती है जहां अन्य वस्तुएं पंजीकृत होती हैं, जैसे कि [[पर्यवेक्षक पैटर्न]] (विशेष रूप से [[घटना से निपटना|ईवेंट हैंडलिंग]] में), यदि ठोस संदर्भ रखा जाता है, तो वस्तुओं को स्पष्ट रूप से अपंजीकृत होना चाहिए, अन्यथा मेमोरी लीक हो जाती है ([[व्यपगत श्रोता समस्या]]), जबकि वीक संदर्भ अपंजीकृत करने की आवश्यकता को हटा देता है। कैश्ड डेटा को धारण करते समय, जिसे यदि आवश्यक हो तो फिर से बनाया जा सकता है, वीक संदर्भ कैश को पुनः प्राप्त करने की अनुमति देते हैं, प्रभावी रूप से त्यागने योग्य मेमोरी का उत्पादन करते हैं। यह अंतिम स्थिति ( कैश) दूसरों से भिन्न है, क्योंकि यह उत्तम है कि यदि आवश्यक हो तो वस्तुओं को मात्र गार्बेज एकत्र किया जाए, और इस प्रकार वीक संदर्भों के भीतर उत्तम भेद की आवश्यकता है, यहां वीक संदर्भ का ठोस रूप है। कई स्तिथियों में वीक संदर्भों को सरलता से उपयोग करने की आवश्यकता नहीं होती है, इसके अतिरिक्त मात्र वीक सरणी या अन्य कंटेनर (अमूर्त डेटा प्रकार) का उपयोग किया जाता है, जिसकी कुंजी या मान वीक संदर्भ होते हैं।


== गार्बेज  संग्रह ==
{{main|गार्बेज संग्रह (कंप्यूटर विज्ञान)}}


== उपयोग करता है ==
गार्बेज संग्रह का उपयोग अप्रयुक्त वस्तुओं को साफ करने के लिए किया जाता है और इस प्रकार मेमोरी लीक और डेटा करप्शन की संभावना को अल्प करता है। गार्बेज संग्रह के दो मुख्य प्रकार हैं: ट्रेसिंग और रेफरेंस काउंटिंग है। रेफरेंस काउंटिंग स्कीम किसी दिए गए ऑब्जेक्ट के संदर्भों की संख्या को रिकॉर्ड करती है और रेफरेंस काउंट शून्य होने पर ऑब्जेक्ट को एकत्र करती है। संदर्भ-गिनती चक्रीय (या परिपत्र) संदर्भों को एकत्र नहीं कर सकती क्योंकि एक समय में मात्र एक ही वस्तु एकत्र की जा सकती है। पारस्परिक रूप से संदर्भित वस्तुओं के समूह जो सीधे अन्य वस्तुओं द्वारा संदर्भित नहीं हैं और अगम्य हैं इस प्रकार स्थायी रूप से निवासी बन सकते हैं; यदि कोई एप्लिकेशन निरन्तर ऐसे अगम्य समूहों को अगम्य वस्तुओं के रूप में उत्पन्न करता है, तो इसका प्रभाव [[स्मृति रिसाव|मेमोरी लीक]] पर होगा। यदि समूह के भीतर कुछ संदर्भों के लिए वीक संदर्भों का उपयोग करके संदर्भ चक्रों से बचा जाता है, तो वीक संदर्भ (संदर्भ जिन्हें संदर्भ गिनती में नहीं गिना जाता है) का उपयोग परिपत्र संदर्भों की समस्या को समाधान करने के लिए किया जा सकता है।
कमजोर संदर्भों के कई सामान्य उपयोग हैं। [[संदर्भ गिनती]] कचरा संग्रह का उपयोग करते समय, कमजोर [[संदर्भ चक्र]] में एक लिंक के लिए कमजोर संदर्भ का उपयोग करके संदर्भ चक्र को तोड़ सकते हैं। जब किसी के पास एक [[साहचर्य सरणी]] (मैपिंग, हैश मैप) होती है, जिसकी कुंजियाँ (संदर्भ) वस्तुएं होती हैं, उदाहरण के लिए वस्तुओं के बारे में सहायक डेटा रखने के लिए, कुंजियों के लिए कमजोर संदर्भों का उपयोग करने से वस्तुओं को केवल कुंजी के रूप में उपयोग करने के कारण जीवित रखने से बचा जाता है। जब किसी के पास एक वस्तु होती है जहां अन्य वस्तुएं पंजीकृत होती हैं, जैसे कि [[पर्यवेक्षक पैटर्न]] (विशेष रूप से [[घटना से निपटना]] में), यदि एक मजबूत संदर्भ रखा जाता है, तो वस्तुओं को स्पष्ट रूप से अपंजीकृत होना चाहिए, अन्यथा एक स्मृति रिसाव होता है ([[व्यपगत श्रोता समस्या]]), जबकि एक कमजोर संदर्भ अपंजीकृत करने की आवश्यकता को हटा देता है। कैश्ड डेटा को धारण करते समय, जिसे यदि आवश्यक हो तो फिर से बनाया जा सकता है, कमजोर संदर्भ कैश को पुनः प्राप्त करने की अनुमति देते हैं, प्रभावी रूप से त्यागने योग्य मेमोरी का उत्पादन करते हैं। यह अंतिम मामला (एक कैश) दूसरों से अलग है, क्योंकि यह बेहतर है कि यदि आवश्यक हो तो वस्तुओं को केवल कचरा एकत्र किया जाए, और इस प्रकार कमजोर संदर्भों के भीतर बेहतर भेद की आवश्यकता है, यहां एक कमजोर संदर्भ का एक मजबूत रूप है। कई मामलों में कमजोर संदर्भों को सीधे उपयोग करने की आवश्यकता नहीं होती है, इसके बजाय केवल एक कमजोर सरणी या अन्य कंटेनर (अमूर्त डेटा प्रकार) का उपयोग किया जाता है, जिसकी कुंजी या मान कमजोर संदर्भ होते हैं।


== कचरा संग्रह ==
इस प्रकार के ठोस के प्रति वीक संदर्भ भेद का अधिक ही सामान्य स्थिति वृक्ष संरचनाओं में है, जैसे दस्तावेज़ ऑब्जेक्ट मॉडल (डीओएम), जहां माता-पिता से बच्चे के संदर्भ ठोस हैं, किंतु बच्चे से माता-पिता के संदर्भ वीक हैं। उदाहरण के लिए, ऐप्पल का [[कोको (एपीआई)]] रूप इस दृष्टिकोण का अनुरोध करता है।<ref>{{cite web|url=https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html|title=प्रैक्टिकल मेमोरी प्रबंधन|website=developer.apple.com}}</ref> वास्तव में, यहां तक ​​कि जब ऑब्जेक्ट ग्राफ वृक्ष नहीं है, तो वृक्ष की संरचना प्रायः वस्तु स्वामित्व की धारणा से प्रारम्भ की जा सकती है, जहां स्वामित्व संबंध ठोस होते हैं और वृक्ष बनाते हैं, और गैर-स्वामित्व संबंध वीक होते हैं और वृक्ष बनाने की आवश्यकता नहीं होती है। यह दृष्टिकोण [[सी ++]] (प्री-[[सी ++ 11]]) में सामान्य है, रॉ पॉइंटर्स को वीक संदर्भों के रूप में उपयोग करते हुए। यदि, इस दृष्टिकोण का नकारात्मक पक्ष यह है कि यह पता लगाने की क्षमता की अनुमति नहीं है कि कब मूल शाखा को हटा दिया गया और हटा दिया गया। C++ 11 मानक के पश्चात से, बूस्ट (सी++ लाइब्रेरी) लाइब्रेरी से उत्तराधिकार में प्राप्त shared_ptr और Weak_ptr का उपयोग करके समाधान जोड़ा गया था।
{{main|Garbage collection (computer science)}}
कचरा संग्रह का उपयोग अप्रयुक्त वस्तुओं को साफ करने के लिए किया जाता है और इस प्रकार मेमोरी लीक और डेटा भ्रष्टाचार की संभावना को कम करता है। कचरा संग्रह के दो मुख्य प्रकार हैं: ट्रेसिंग और रेफरेंस काउंटिंग। रेफरेंस काउंटिंग स्कीम किसी दिए गए ऑब्जेक्ट के संदर्भों की संख्या को रिकॉर्ड करती है और रेफरेंस काउंट शून्य होने पर ऑब्जेक्ट को कलेक्ट करती है। संदर्भ-गिनती चक्रीय (या परिपत्र) संदर्भों को एकत्र नहीं कर सकती क्योंकि एक समय में केवल एक ही वस्तु एकत्र की जा सकती है। पारस्परिक रूप से संदर्भित वस्तुओं के समूह जो सीधे अन्य वस्तुओं द्वारा संदर्भित नहीं हैं और अगम्य हैं इस प्रकार स्थायी रूप से निवासी बन सकते हैं; यदि कोई एप्लिकेशन लगातार ऐसे अगम्य समूहों को अगम्य वस्तुओं के रूप में उत्पन्न करता है, तो इसका प्रभाव [[स्मृति रिसाव]] पर पड़ेगा। यदि समूह के भीतर कुछ संदर्भों के लिए कमजोर संदर्भों का उपयोग करके संदर्भ चक्रों से बचा जाता है, तो कमजोर संदर्भ (संदर्भ जिन्हें संदर्भ गिनती में नहीं गिना जाता है) का उपयोग परिपत्र संदर्भों की समस्या को हल करने के लिए किया जा सकता है।


इस तरह के मजबूत बनाम कमजोर संदर्भ भेद का एक बहुत ही सामान्य मामला वृक्ष संरचनाओं में है, जैसे दस्तावेज़ ऑब्जेक्ट मॉडल (डीओएम), जहां माता-पिता से बच्चे के संदर्भ मजबूत हैं, लेकिन बच्चे से माता-पिता के संदर्भ कमजोर हैं। उदाहरण के लिए, ऐप्पल का [[कोको (एपीआई)]] ढांचा इस दृष्टिकोण की सिफारिश करता है।<ref>{{cite web|url=https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html|title=प्रैक्टिकल मेमोरी प्रबंधन|website=developer.apple.com}}</ref> वास्तव में, यहां तक ​​कि जब ऑब्जेक्ट ग्राफ एक पेड़ नहीं है, तो एक पेड़ की संरचना अक्सर वस्तु स्वामित्व की धारणा से लागू की जा सकती है, जहां स्वामित्व संबंध मजबूत होते हैं और पेड़ बनाते हैं, और गैर-स्वामित्व संबंध कमजोर होते हैं और पेड़ बनाने की आवश्यकता नहीं होती है। - यह दृष्टिकोण [[सी ++]] (प्री-[[सी ++ 11]]) में आम है, कच्चे पॉइंटर्स को कमजोर संदर्भों के रूप में उपयोग करते हुए। हालाँकि, इस दृष्टिकोण का नकारात्मक पक्ष यह है कि यह पता लगाने की क्षमता की अनुमति नहीं है कि कब एक मूल शाखा को हटा दिया गया और हटा दिया गया। C++ 11 मानक के बाद से, Boost (C++ लाइब्रेरी) लाइब्रेरी से विरासत में प्राप्त Smart_pointer#shared_ptr_and_weak_ptr|shared_ptr और Weak_ptr का उपयोग करके एक समाधान जोड़ा गया था।
मेमोरी में अनावश्यक वस्तुओं की संख्या को अल्प करने के लिए वीक संदर्भों का भी उपयोग किया जाता है, जिससे कार्यक्रम को यह प्रदर्शित करने की अनुमति मिलती है कि कौन सी वस्तुओं को मात्र वीक रूप से संदर्भित करना साधारण महत्व है।{{citation needed|date=February 2023}}


स्मृति में अनावश्यक वस्तुओं की संख्या को कम करने के लिए कमजोर संदर्भों का भी उपयोग किया जाता है, जिससे कार्यक्रम को यह इंगित करने की अनुमति मिलती है कि कौन सी वस्तुओं को केवल कमजोर रूप से संदर्भित करके मामूली महत्व है।{{citation needed|date=February 2023}}
== विविधताएं ==


== विविधताएं ==
कुछ भाषाओं में वीक संदर्भ शक्ति के कई स्तर होते हैं। उदाहरण के लिए, जावा में घटती शक्ति, नरम, वीक संदर्भों के क्रम में, पैकेज java.lang.ref में परिभाषित किया गया है।<ref>{{cite web |last=Nicholas |first=Ethan |url=http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |title=कमजोर संदर्भों को समझना|work=java.net |date=May 4, 2006 |archive-url=https://web.archive.org/web/20110303225354/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |access-date=October 1, 2010|archive-date=2011-03-03 }}</ref> प्रत्येक संदर्भ प्रकार में पुन: योग्यता की एक संबद्ध धारणा होती है। गार्बेज संग्राहक (जीसी) वस्तु को निर्बाध करने के लिए यह निर्धारित करने के लिए किसी वस्तु के प्रकार की पहुंच क्षमता का उपयोग करता है। जीसी के लिए किसी ऐसी वस्तु को निर्बाध करना सुरक्षित है जो धीरे-धीरे पहुंच योग्य है, किंतु जीसी ऐसा नहीं करने का निर्णय ले सकती है यदि उसे लगता है कि जेवीएम मेमोरी को बचा सकता है (उदाहरण के लिए जेवीएम में अधिक अप्रयुक्त हीप स्पेस है)। जैसे ही जीसी वस्तु को नोटिस करता है, जीसी वीक रूप से पहुंच योग्य वस्तु को मुक्त कर देगा। अन्य संदर्भ प्रकारों के विपरीत, संदर्भ का पालन नहीं किया जा सकता है। दूसरी ओर, संदर्भ कार्यक्रम को सूचित करने के लिए प्रणाली प्रदान करते हैं जब किसी वस्तु को निर्बाध किया गया हो (संदर्भ श्रेणी का उपयोग करके अधिसूचना प्रारम्भ की जाती है)।


कुछ भाषाओं में कमजोर संदर्भ शक्ति के कई स्तर होते हैं। उदाहरण के लिए, जावा (प्रोग्रामिंग लैंग्वेज) में घटती ताकत, [[ कोमल संदर्भ ]], कमजोर और [[ प्रेत संदर्भ ]] रेफरेंस के क्रम में [[जावा पैकेज]] जावा प्लेटफॉर्म, Standard Edition#java.lang.ref|java.lang.ref में परिभाषित किया गया है।<ref>{{cite web |last=Nicholas |first=Ethan |url=http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |title=कमजोर संदर्भों को समझना|work=java.net |date=May 4, 2006 |archive-url=https://web.archive.org/web/20110303225354/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |access-date=October 1, 2010|archive-date=2011-03-03 }}</ref> प्रत्येक संदर्भ प्रकार में पुन: योग्यता की एक संबद्ध धारणा होती है। कचरा संग्राहक (जीसी) वस्तु को मुक्त करने के लिए यह निर्धारित करने के लिए किसी वस्तु के प्रकार की पहुंच क्षमता का उपयोग करता है। जीसी के लिए किसी ऐसी वस्तु को मुक्त करना सुरक्षित है जो धीरे-धीरे पहुंच योग्य है, लेकिन जीसी ऐसा नहीं करने का निर्णय ले सकती है यदि उसे लगता है कि जेवीएम मेमोरी को बचा सकता है (उदाहरण के लिए जेवीएम में बहुत अधिक अप्रयुक्त हीप स्पेस है)। जैसे ही जीसी वस्तु को नोटिस करता है, जीसी कमजोर रूप से पहुंच योग्य वस्तु को मुक्त कर देगा। अन्य संदर्भ प्रकारों के विपरीत, प्रेत संदर्भ का पालन नहीं किया जा सकता है। दूसरी ओर, प्रेत संदर्भ कार्यक्रम को सूचित करने के लिए एक तंत्र प्रदान करते हैं जब किसी वस्तु को मुक्त किया गया हो (संदर्भ कतारों का उपयोग करके अधिसूचना लागू की जाती है)।<!-- what situations call for which type of reference -->
सी में, वीक संदर्भ इस बात से भिन्न हैं कि वे [[वस्तु पुनरुत्थान]] को ट्रैक करते हैं या नहीं। यह भेद ठोस संदर्भों के लिए नहीं होता है, क्योंकि वस्तुओं को [[अंतिम रूप]] नहीं दिया जाता है यदि उनके निकट कोई ठोस संदर्भ है। डिफ़ॉल्ट रूप से, सी वीक संदर्भ में पुनरुत्थान को ट्रैक नहीं करते हैं, जिसका अर्थ है कि यदि कोई वस्तु पुनर्जीवित होती है तो वीक संदर्भ अद्यतन नहीं होता है; इन्हें छोटा वीक संदर्भ कहा जाता है, और वीक संदर्भ जो पुनरुत्थान को ट्रैक करते हैं उन्हें लंबे वीक संदर्भ कहा जाता है।{{sfn|Goldshtein|Zurbalev|Flatow|2012|p=[https://books.google.com/books?id=D3J58cs-i44C&q=resurrection&pg=PA131 131]}}
सी # में, कमजोर संदर्भ इस बात से अलग हैं कि वे [[वस्तु पुनरुत्थान]] को ट्रैक करते हैं या नहीं। यह भेद मजबूत संदर्भों के लिए नहीं होता है, क्योंकि वस्तुओं को [[अंतिम रूप]] नहीं दिया जाता है यदि उनके पास कोई मजबूत संदर्भ है। डिफ़ॉल्ट रूप से, सी # कमजोर संदर्भ में पुनरुत्थान को ट्रैक नहीं करते हैं, जिसका अर्थ है कि यदि कोई वस्तु पुनर्जीवित होती है तो एक कमजोर संदर्भ अद्यतन नहीं होता है; इन्हें छोटा कमजोर संदर्भ कहा जाता है, और कमजोर संदर्भ जो पुनरुत्थान को ट्रैक करते हैं उन्हें लंबे कमजोर संदर्भ कहा जाता है।{{sfn|Goldshtein|Zurbalev|Flatow|2012|p=[https://books.google.com/books?id=D3J58cs-i44C&q=resurrection&pg=PA131 131]}}


कुछ गैर-कचरा-संग्रहित भाषाएँ, जैसे कि C++, कचरा संग्रह पुस्तकालयों के समर्थन के हिस्से के रूप में कमजोर/मजबूत संदर्भ कार्यक्षमता प्रदान करती हैं। बूस्ट सी ++ लाइब्रेरी मजबूत और कमजोर संदर्भ प्रदान करती है। [[ स्मार्ट सूचक ]]्स के कमजोर समकक्षों के रूप में नियमित सी ++ पॉइंटर्स का उपयोग करना एक गलती है क्योंकि इस तरह के उपयोग से यह पता लगाने की क्षमता को हटा दिया जाता है कि मजबूत संदर्भ संख्या 0 हो गई है और ऑब्जेक्ट हटा दिया गया है। इससे भी बदतर, यह पता लगाने की अनुमति नहीं देता है कि क्या एक और मजबूत संदर्भ पहले से ही दिए गए सादे सूचक को ट्रैक कर रहा है। यह एक ही प्लेन पॉइंटर को ट्रैक करने वाले दो (या अधिक) स्मार्ट पॉइंटर्स होने की संभावना का परिचय देता है (जैसे ही इन स्मार्ट पॉइंटर्स में से एक की रेफरेंस काउंट 0 तक पहुंचता है और ऑब्जेक्ट डिलीट हो जाता है) भ्रष्टाचार का कारण बनता है।
कुछ गैर-गार्बेज संग्रहित भाषाएँ, जैसे कि सी++, गार्बेज संग्रह पुस्तकालयों के समर्थन के भाग के रूप में वीक/ ठोस संदर्भ कार्यक्षमता प्रदान करती हैं। बूस्ट सी++ लाइब्रेरी ठोस और वीक संदर्भ प्रदान करती है। [[ स्मार्ट सूचक |स्मार्ट पॉइंटर्स]] के वीक समकक्षों के रूप में नियमित सी++ पॉइंटर्स का उपयोग करना त्रुटिपूर्ण है क्योंकि इस प्रकार के उपयोग से यह ज्ञात लगाने की क्षमता को हटा दिया जाता है कि ठोस संदर्भ संख्या 0 हो गई है और ऑब्जेक्ट हटा दिया गया है। इससे, यह ज्ञात करने की अनुमति नहीं देता है कि क्या ठोस संदर्भ पूर्व से ही दिए गए प्लेन पॉइंटर्स को ट्रैक कर रहा है। यह प्लेन पॉइंटर को ट्रैक करने वाले दो (या अधिक) स्मार्ट पॉइंटर्स होने की संभावना का परिचय देता है (जैसे ही इन स्मार्ट पॉइंटर्स में से एक की रेफरेंस काउंट 0 तक पहुंचता है और ऑब्जेक्ट डिलीट हो जाता है) करप्शन का कारण बनता है।


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


=== जावा ===
=== जावा ===


1998 में जावा 1.2 पेश किया गया<ref>{{cite web|url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html|title=WeakReference (Java Platform SE 7 )|website=docs.oracle.com}}</ref> दो प्रकार के कमजोर संदर्भ, एक को सॉफ्ट रेफरेंस के रूप में जाना जाता है (जीसी-प्रबंधित इन-मेमोरी कैश को बनाए रखने के लिए उपयोग करने का इरादा है, लेकिन जो एंड्रॉइड जैसे डायनेमिक हीप के साथ कुछ प्लेटफॉर्म पर व्यवहार में बहुत अच्छा काम नहीं करता है<ref>{{cite web|url=https://developer.android.com/reference/java/lang/ref/SoftReference.html|title=सॉफ्ट रेफरेंस - एंड्रॉइड डेवलपर्स|website=developer.android.com}}</ref>) और दूसरा केवल एक कमजोर संदर्भ के रूप में। इसने खतरनाक और अक्षम finalize() तंत्र के विकल्प के रूप में फैंटम संदर्भों को डब किए गए एक संबंधित प्रायोगिक तंत्र को भी जोड़ा।<ref>{{cite web|url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/PhantomReference.html|title=PhantomReference (Java Platform SE 7 )|website=docs.oracle.com}}</ref>
1998 में जावा 1.2 ने <ref>{{cite web|url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html|title=WeakReference (Java Platform SE 7 )|website=docs.oracle.com}}</ref> दो प्रकार के वीक संदर्भ प्रस्तुत किए, एक को सॉफ्ट रेफरेंस के रूप में जाना जाता है (जीसी-प्रबंधित इन-मेमोरी कैश को बनाए रखने के लिए उपयोग करने का संकल्प है, किंतु जो कुछ प्लेटफॉर्म पर व्यवहार में अधिक उत्तम कार्य नहीं करता है<ref>{{cite web|url=https://developer.android.com/reference/java/lang/ref/SoftReference.html|title=सॉफ्ट रेफरेंस - एंड्रॉइड डेवलपर्स|website=developer.android.com}}</ref>) एंड्रॉइड जैसे डायनेमिक हीप के साथ और दूसरा मात्र वीक संदर्भ के रूप में जाना जाता है। इसने आशंका और अकुशल finalize() प्रणाली के विकल्प के रूप में "संदर्भ" नामक संबंधित प्रायोगिक प्रणाली को भी जोड़ा जायेगा।<ref>{{cite web|url=http://docs.oracle.com/javase/7/docs/api/java/lang/ref/PhantomReference.html|title=PhantomReference (Java Platform SE 7 )|website=docs.oracle.com}}</ref>
यदि एक कमजोर संदर्भ बनाया गया है, और फिर कोड में कहीं और <code>get()</code> वास्तविक वस्तु प्राप्त करने के लिए उपयोग किया जाता है, कमजोर संदर्भ कचरा संग्रहण को रोकने के लिए पर्याप्त मजबूत नहीं है, इसलिए यह हो सकता है (यदि वस्तु के लिए कोई मजबूत संदर्भ नहीं है) <code>get()</code> अचानक अशक्त होने लगता है।<ref>https://web.archive.org/web/20110303225354/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references Java Examples</ref>
 
यदि वीक संदर्भ बनाया गया है, और फिर कोड में कहीं और वास्तविक वस्तु प्राप्त करने के लिए <code>get()</code> उपयोग किया जाता है, वीक संदर्भ गार्बेज संग्रहण को रोकने के लिए पर्याप्त ठोस नहीं है, इसलिए यह हो सकता है (यदि वस्तु के लिए कोई ठोस संदर्भ नहीं है) जो<code>get()</code>अकस्मात अशक्त होने लगता है।<ref>https://web.archive.org/web/20110303225354/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references Java Examples</ref>


<syntaxhighlight lang=java>
<syntaxhighlight lang=java>
Line 45: Line 46:
}
}
</syntaxhighlight>
</syntaxhighlight>
कमजोर संदर्भों का एक अन्य उपयोग [[कैश (कंप्यूटिंग)]] लिखने में है। उदाहरण के लिए, एक कमजोर हैश मानचित्र का उपयोग करके, एक कमजोर संदर्भ के माध्यम से विभिन्न संदर्भित वस्तुओं को कैश में संग्रहीत किया जा सकता है। जब कचरा संग्राहक चलता है - उदाहरण के लिए जब एप्लिकेशन की मेमोरी का उपयोग पर्याप्त रूप से अधिक हो जाता है - वे कैश्ड ऑब्जेक्ट जो अब अन्य ऑब्जेक्ट्स द्वारा सीधे संदर्भित नहीं होते हैं, कैश से हटा दिए जाते हैं।
[[कैश (कंप्यूटिंग)]] लिखने में वीक संदर्भों का अन्य उपयोग है। उदाहरण के लिए, वीक हैश मानचित्र का उपयोग करके, वीक संदर्भ के माध्यम से विभिन्न संदर्भित वस्तुओं को कैश में संग्रहीत किया जा सकता है। जब गार्बेज संग्राहक चलता है- उदाहरण के लिए जब एप्लिकेशन की मेमोरी का उपयोग पर्याप्त रूप से अधिक हो जाता है- वे कैश्ड ऑब्जेक्ट जो अब अन्य ऑब्जेक्ट्स द्वारा सीधे संदर्भित नहीं होते हैं, कैश से हटा दिए जाते हैं।


=== स्मालटॉक ===
=== स्मालटॉक ===
Line 68: Line 69:
</syntaxhighlight>
</syntaxhighlight>


 
=== लुआ ===
=== दो ===


<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
Line 81: Line 81:


=== उद्देश्य-सी 2.0 ===
=== उद्देश्य-सी 2.0 ===
[[ उद्देश्य सी ]] 2.0 में, न केवल कचरा संग्रह, बल्कि संदर्भ गणना भी कमजोर संदर्भों से प्रभावित होगी। निम्नलिखित उदाहरण में सभी चर और गुण कमजोर हैं।
[[ उद्देश्य सी | ऑब्जेक्टिव सी]] 2.0 में, न मात्र गार्बेज संग्रह, किन्तु स्वचालित संदर्भ गणना भी वीक संदर्भों से प्रभावित होगी। निम्नलिखित उदाहरण में सभी चर और गुण वीक हैं।
<syntaxhighlight lang=objc>
<syntaxhighlight lang=objc>
@interface WeakRef : NSObject
@interface WeakRef : NSObject
Line 94: Line 94:
@end
@end
</syntaxhighlight>
</syntaxhighlight>
बीच में अंतर <code>weak</code> (<code>__weak</code>) और <code>unsafe_unretained</code> (<code>__unsafe_unretained</code>) यह है कि जब वेरिएबल की ओर इशारा किया गया ऑब्जेक्ट डिलीकेट किया जा रहा है, तो वेरिएबल का मान बदला जा रहा है या नहीं। <code>weak</code> लोगों को नल पॉइंटर | में अपडेट किया जाएगा<code>nil</code>और यह <code>unsafe_unretained</code> झूलने वाले सूचक के रूप में एक को अपरिवर्तित छोड़ दिया जाएगा। <code>weak</code> मैक ओएस एक्स लायन | मैक ओएस एक्स 10.7 शेर और [[आईओएस 5]] के साथ-साथ [[एक्सकोड]] 4.1 (आईओएस के लिए 4.2) और केवल एआरसी का उपयोग करते समय ऑब्जेक्टिव-सी में ई> संदर्भ जोड़े गए हैं। Mac OS X, iOS और GNUstep के पुराने संस्करण केवल समर्थन करते हैं <code>unsafe_unretained</code> कमजोर के रूप में संदर्भ।
<code>weak</code> (<code>__weak</code>) और <code>unsafe_unretained</code> (<code>__unsafe_unretained</code>) के मध्य का अंतर यह है कि जब चर की ओर संकेत किया गया ऑब्जेक्ट डिलीकेट किया जा रहा है, तो चर का मान परिवर्तित किया जा रहा है या नहीं। <code>weak</code> लोगों को नल पॉइंटर में अपडेट किया जाएगा और <code>nil</code> और <code>unsafe_unretained</code> को पॉइंटर्स  के रूप में अपरिवर्तित छोड़ दिया जाएगा। मैक ओएस एक्स 10.7 लायन और [[आईओएस 5]] के साथ-साथ [[एक्सकोड]] 4.1 (आईओएस के लिए 4.2) और मात्र एआरसी का उपयोग करते समय <code>weak</code> ऑब्जेक्टिव-सी में संदर्भ जोड़े गए हैं। मैक ओएस एक्स, आईओएस, और जीएनयूस्टेप के प्राचीन संस्करण वीक संदर्भ के रूप में मात्र  <code>unsafe_unretained</code> संदर्भों का समर्थन करते हैं। 


=== [[वाला (प्रोग्रामिंग लैंग्वेज)]]===
=== वाला (प्रोग्रामिंग लैंग्वेज)===
<syntaxhighlight lang="vala">
<syntaxhighlight lang="vala">
class Node {
class Node {
Line 103: Line 103:
}
}
</syntaxhighlight>
</syntaxhighlight>


===पायथन===
===पायथन===
Line 128: Line 127:


== यह भी देखें ==
== यह भी देखें ==
* शीतल संदर्भ
* सॉफ्ट संदर्भ
* प्रेत संदर्भ
* फैंटम संदर्भ
* [[वृत्तीय संदर्भ]]
* [[वृत्तीय संदर्भ]]
* [[पंचांग]]
* [[पंचांग|एफेमेरों]]  


== संदर्भ ==
== संदर्भ ==
Line 138: Line 137:
* {{Cite book | isbn = 978-1-4302-4458-5 | title = Pro .NET Performance: Optimize Your C# Applications | last1 = Goldshtein | first1 = Sasha | last2 = Zurbalev | first2 = Dima | last3 = Flatow | first3 = Ido | year = 2012 | publisher = Apress | url = https://academicexperts.com/programming/  }}
* {{Cite book | isbn = 978-1-4302-4458-5 | title = Pro .NET Performance: Optimize Your C# Applications | last1 = Goldshtein | first1 = Sasha | last2 = Zurbalev | first2 = Dima | last3 = Flatow | first3 = Ido | year = 2012 | publisher = Apress | url = https://academicexperts.com/programming/  }}
{{refend}}
{{refend}}


== बाहरी संबंध ==
== बाहरी संबंध ==


=== सी ++ ===
=== सी ++ ===
Line 150: Line 145:


=== जावा ===
=== जावा ===
* [http://www.pawlan.com/monica/articles/refobjs/ जावा डेवलपर लेख: 'संदर्भ वस्तुएं और कचरा संग्रह']
* [http://www.pawlan.com/monica/articles/refobjs/ जावा डेवलपर लेख: 'संदर्भ वस्तुएं और गार्बेज  संग्रह']
* {{cite web |last=Nicholas |first=Ethan |url=http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |title=कमजोर संदर्भों को समझना|work=java.net |date=May 4, 2006 |archive-url=https://web.archive.org/web/20100819115659/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |access-date=October 1, 2010 |archive-date=August 19, 2010 |url-status=bot: unknown }}
* {{cite web |last=Nicholas |first=Ethan |url=http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |title=कमजोर संदर्भों को समझना|work=java.net |date=May 4, 2006 |archive-url=https://web.archive.org/web/20100819115659/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references |access-date=October 1, 2010 |archive-date=August 19, 2010 |url-status=bot: unknown }}
* [http://rcache.sourceforge.net/ RCache - कमजोर/सॉफ्ट संदर्भ आधारित कैश के लिए जावा लाइब्रेरी]
* [http://rcache.sourceforge.net/ RCache - वीक/सॉफ्ट संदर्भ आधारित कैश के लिए जावा लाइब्रेरी]
* [http://www.ibm.com/developerworks/java/library/j-jtp11225/ जावा सिद्धांत और व्यवहार: कमजोर संदर्भों के साथ मेमोरी लीक को प्लग करना]
* [http://www.ibm.com/developerworks/java/library/j-jtp11225/ जावा सिद्धांत और व्यवहार: वीक संदर्भों के साथ मेमोरी लीक को प्लग करना]


=== पीएचपी ===
=== पीएचपी ===
* [https://www.php.net/manual/en/class.weakreference.php कमजोर संदर्भ]
* [https://www.php.net/manual/en/class.weakreference.php वीक संदर्भ]


=== पायथन ===
=== पायथन ===
* [https://docs.python.org/3/library/weakref.html कमजोर रेफरी - कमजोर संदर्भ - पायथन 3 प्रलेखन]
* [https://docs.python.org/3/library/weakref.html वीक रेफरी - वीक संदर्भ - पायथन 3 प्रलेखन]
* फ्रेड एल. ड्रेक, जूनियर, [https://www.python.org/dev/peps/pep-0205/ PEP 205: Weak References], पायथन एन्हांसमेंट प्रपोजल, जनवरी 2001।
* फ्रेड एल. ड्रेक, जूनियर, [https://www.python.org/dev/peps/pep-0205/ PEP 205: Weak References], पायथन एन्हांसमेंट प्रपोजल, जनवरी 2001।
{{Memory management navbox}}


{{DEFAULTSORT:Weak Reference}}
{{DEFAULTSORT:Weak Reference}}
श्रेणी:डेटा प्रकार
श्रेणी:स्मृति प्रबंधन




[[Category: Machine Translated Page]]
[[Category:All articles with unsourced statements|Weak Reference]]
[[Category:Created On 13/05/2023]]
[[Category:Articles with unsourced statements from February 2023|Weak Reference]]
[[Category:CS1 maint|Weak Reference]]
[[Category:Collapse templates|Weak Reference]]
[[Category:Created On 13/05/2023|Weak Reference]]
[[Category:Lua-based templates|Weak Reference]]
[[Category:Machine Translated Page|Weak Reference]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists|Weak Reference]]
[[Category:Pages with script errors|Weak Reference]]
[[Category:Sidebars with styles needing conversion|Weak Reference]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready|Weak Reference]]
[[Category:Templates generating microformats|Weak Reference]]
[[Category:Templates that add a tracking category|Weak Reference]]
[[Category:Templates that are not mobile friendly|Weak Reference]]
[[Category:Templates that generate short descriptions|Weak Reference]]
[[Category:Templates using TemplateData|Weak Reference]]
[[Category:Wikipedia metatemplates|Weak Reference]]

Latest revision as of 16:08, 30 October 2023

कंप्यूटर प्रोग्रामिंग में, संदर्भ (कंप्यूटर विज्ञान) होता है जो संदर्भित वस्तु (कंप्यूटर विज्ञान) को गार्बेज संग्राहक (कंप्यूटर विज्ञान) द्वारा संग्रह से सुरक्षित नहीं करता है, ठोस संदर्भ के विपरीत होता है। वीक संदर्भों द्वारा मात्र संदर्भित वस्तु जिसका अर्थ है कि वस्तु तक पहुंचने वाले संदर्भों की प्रत्येक श्रृंखला में लिंक के रूप में अल्प से अल्प वीक संदर्भ सम्मिलित है- इसे वीक पहुंच योग्य माना जाता है और इसे अगम्य के रूप में माना जा सकता है और इसलिए इसे किसी भी समय एकत्र किया जा सकता है। 7.4 संस्करण के पश्चात से कुछ गार्बेज-संग्रहित भाषाएं वीक संदर्भों के विभिन्न स्तरों को प्रदर्शित करती हैं या उनका समर्थन करती हैं, जैसे कि सी, जावा (प्रोग्रामिंग भाषा), लिस्प (प्रोग्रामिंग भाषा), ओ कैमल, पर्ल, पायथन (प्रोग्रामिंग भाषा)[1] और पीएचपी आदि।[2]

उपयोग

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

गार्बेज संग्रह

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

इस प्रकार के ठोस के प्रति वीक संदर्भ भेद का अधिक ही सामान्य स्थिति वृक्ष संरचनाओं में है, जैसे दस्तावेज़ ऑब्जेक्ट मॉडल (डीओएम), जहां माता-पिता से बच्चे के संदर्भ ठोस हैं, किंतु बच्चे से माता-पिता के संदर्भ वीक हैं। उदाहरण के लिए, ऐप्पल का कोको (एपीआई) रूप इस दृष्टिकोण का अनुरोध करता है।[3] वास्तव में, यहां तक ​​कि जब ऑब्जेक्ट ग्राफ वृक्ष नहीं है, तो वृक्ष की संरचना प्रायः वस्तु स्वामित्व की धारणा से प्रारम्भ की जा सकती है, जहां स्वामित्व संबंध ठोस होते हैं और वृक्ष बनाते हैं, और गैर-स्वामित्व संबंध वीक होते हैं और वृक्ष बनाने की आवश्यकता नहीं होती है। यह दृष्टिकोण सी ++ (प्री-सी ++ 11) में सामान्य है, रॉ पॉइंटर्स को वीक संदर्भों के रूप में उपयोग करते हुए। यदि, इस दृष्टिकोण का नकारात्मक पक्ष यह है कि यह पता लगाने की क्षमता की अनुमति नहीं है कि कब मूल शाखा को हटा दिया गया और हटा दिया गया। C++ 11 मानक के पश्चात से, बूस्ट (सी++ लाइब्रेरी) लाइब्रेरी से उत्तराधिकार में प्राप्त shared_ptr और Weak_ptr का उपयोग करके समाधान जोड़ा गया था।

मेमोरी में अनावश्यक वस्तुओं की संख्या को अल्प करने के लिए वीक संदर्भों का भी उपयोग किया जाता है, जिससे कार्यक्रम को यह प्रदर्शित करने की अनुमति मिलती है कि कौन सी वस्तुओं को मात्र वीक रूप से संदर्भित करना साधारण महत्व है।[citation needed]

विविधताएं

कुछ भाषाओं में वीक संदर्भ शक्ति के कई स्तर होते हैं। उदाहरण के लिए, जावा में घटती शक्ति, नरम, वीक संदर्भों के क्रम में, पैकेज java.lang.ref में परिभाषित किया गया है।[4] प्रत्येक संदर्भ प्रकार में पुन: योग्यता की एक संबद्ध धारणा होती है। गार्बेज संग्राहक (जीसी) वस्तु को निर्बाध करने के लिए यह निर्धारित करने के लिए किसी वस्तु के प्रकार की पहुंच क्षमता का उपयोग करता है। जीसी के लिए किसी ऐसी वस्तु को निर्बाध करना सुरक्षित है जो धीरे-धीरे पहुंच योग्य है, किंतु जीसी ऐसा नहीं करने का निर्णय ले सकती है यदि उसे लगता है कि जेवीएम मेमोरी को बचा सकता है (उदाहरण के लिए जेवीएम में अधिक अप्रयुक्त हीप स्पेस है)। जैसे ही जीसी वस्तु को नोटिस करता है, जीसी वीक रूप से पहुंच योग्य वस्तु को मुक्त कर देगा। अन्य संदर्भ प्रकारों के विपरीत, संदर्भ का पालन नहीं किया जा सकता है। दूसरी ओर, संदर्भ कार्यक्रम को सूचित करने के लिए प्रणाली प्रदान करते हैं जब किसी वस्तु को निर्बाध किया गया हो (संदर्भ श्रेणी का उपयोग करके अधिसूचना प्रारम्भ की जाती है)।

सी में, वीक संदर्भ इस बात से भिन्न हैं कि वे वस्तु पुनरुत्थान को ट्रैक करते हैं या नहीं। यह भेद ठोस संदर्भों के लिए नहीं होता है, क्योंकि वस्तुओं को अंतिम रूप नहीं दिया जाता है यदि उनके निकट कोई ठोस संदर्भ है। डिफ़ॉल्ट रूप से, सी वीक संदर्भ में पुनरुत्थान को ट्रैक नहीं करते हैं, जिसका अर्थ है कि यदि कोई वस्तु पुनर्जीवित होती है तो वीक संदर्भ अद्यतन नहीं होता है; इन्हें छोटा वीक संदर्भ कहा जाता है, और वीक संदर्भ जो पुनरुत्थान को ट्रैक करते हैं उन्हें लंबे वीक संदर्भ कहा जाता है।[5]

कुछ गैर-गार्बेज संग्रहित भाषाएँ, जैसे कि सी++, गार्बेज संग्रह पुस्तकालयों के समर्थन के भाग के रूप में वीक/ ठोस संदर्भ कार्यक्षमता प्रदान करती हैं। बूस्ट सी++ लाइब्रेरी ठोस और वीक संदर्भ प्रदान करती है। स्मार्ट पॉइंटर्स के वीक समकक्षों के रूप में नियमित सी++ पॉइंटर्स का उपयोग करना त्रुटिपूर्ण है क्योंकि इस प्रकार के उपयोग से यह ज्ञात लगाने की क्षमता को हटा दिया जाता है कि ठोस संदर्भ संख्या 0 हो गई है और ऑब्जेक्ट हटा दिया गया है। इससे, यह ज्ञात करने की अनुमति नहीं देता है कि क्या ठोस संदर्भ पूर्व से ही दिए गए प्लेन पॉइंटर्स को ट्रैक कर रहा है। यह प्लेन पॉइंटर को ट्रैक करने वाले दो (या अधिक) स्मार्ट पॉइंटर्स होने की संभावना का परिचय देता है (जैसे ही इन स्मार्ट पॉइंटर्स में से एक की रेफरेंस काउंट 0 तक पहुंचता है और ऑब्जेक्ट डिलीट हो जाता है) करप्शन का कारण बनता है।

उदाहरण

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

जावा

1998 में जावा 1.2 ने [6] दो प्रकार के वीक संदर्भ प्रस्तुत किए, एक को सॉफ्ट रेफरेंस के रूप में जाना जाता है (जीसी-प्रबंधित इन-मेमोरी कैश को बनाए रखने के लिए उपयोग करने का संकल्प है, किंतु जो कुछ प्लेटफॉर्म पर व्यवहार में अधिक उत्तम कार्य नहीं करता है[7]) एंड्रॉइड जैसे डायनेमिक हीप के साथ और दूसरा मात्र वीक संदर्भ के रूप में जाना जाता है। इसने आशंका और अकुशल finalize() प्रणाली के विकल्प के रूप में "संदर्भ" नामक संबंधित प्रायोगिक प्रणाली को भी जोड़ा जायेगा।[8]

यदि वीक संदर्भ बनाया गया है, और फिर कोड में कहीं और वास्तविक वस्तु प्राप्त करने के लिए get() उपयोग किया जाता है, वीक संदर्भ गार्बेज संग्रहण को रोकने के लिए पर्याप्त ठोस नहीं है, इसलिए यह हो सकता है (यदि वस्तु के लिए कोई ठोस संदर्भ नहीं है) जोget()अकस्मात अशक्त होने लगता है।[9]

import java.lang.ref.WeakReference;

public class ReferenceTest {
    public static void main(String[] args) throws InterruptedException {
        WeakReference r = new WeakReference("I'm here");
        StrongReference sr = new StrongReference("I'm here");
        System.out.println("Before gc: r=" + r.get() + ", static=" + sr.get());
        System.gc();
        Thread.sleep(100);

        // Only r.get() becomes null.
        System.out.println("After gc: r=" + r.get() + ", static=" + sr.get());
    }
}

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

स्मालटॉक

|a s1 s2|

s1 := 'hello' copy.     "that's a strong reference"
s2 := 'world' copy.     "that's a strong reference"
a := WeakArray with:s1 with:s2.
a printOn: Transcript. 
ObjectMemory collectGarbage.
a printOn: Transcript.  "both elements still there"

s1 := nil.              "strong reference goes away" 
ObjectMemory collectGarbage.
a printOn: Transcript.  "first element gone"

s2 := nil.              "strong reference goes away" 
ObjectMemory collectGarbage.
a printOn: Transcript.  "second element gone"

लुआ

weak_table = setmetatable({}, {__mode="v"})
weak_table.item = {}
print(weak_table.item)
collectgarbage()
print(weak_table.item)


उद्देश्य-सी 2.0

ऑब्जेक्टिव सी 2.0 में, न मात्र गार्बेज संग्रह, किन्तु स्वचालित संदर्भ गणना भी वीक संदर्भों से प्रभावित होगी। निम्नलिखित उदाहरण में सभी चर और गुण वीक हैं।

@interface WeakRef : NSObject
{
    __weak NSString *str1;
    __unsafe_unretained NSString *str2;
}

@property (nonatomic, weak) NSString *str3;
@property (nonatomic, unsafe_unretained) NSString *str4;

@end

weak (__weak) और unsafe_unretained (__unsafe_unretained) के मध्य का अंतर यह है कि जब चर की ओर संकेत किया गया ऑब्जेक्ट डिलीकेट किया जा रहा है, तो चर का मान परिवर्तित किया जा रहा है या नहीं। weak लोगों को नल पॉइंटर में अपडेट किया जाएगा और nil और unsafe_unretained को पॉइंटर्स के रूप में अपरिवर्तित छोड़ दिया जाएगा। मैक ओएस एक्स 10.7 लायन और आईओएस 5 के साथ-साथ एक्सकोड 4.1 (आईओएस के लिए 4.2) और मात्र एआरसी का उपयोग करते समय weak ऑब्जेक्टिव-सी में संदर्भ जोड़े गए हैं। मैक ओएस एक्स, आईओएस, और जीएनयूस्टेप के प्राचीन संस्करण वीक संदर्भ के रूप में मात्र unsafe_unretained संदर्भों का समर्थन करते हैं।

वाला (प्रोग्रामिंग लैंग्वेज)

class Node {
    public weak Node prev; // a weak reference is used to avoid circular references between nodes of a doubly-linked list
    public Node next;
}

पायथन

>>> import weakref
>>> import gc
>>> class Egg:
...     def spam(self):
...         print("I'm alive!")
...
>>> obj = Egg()
>>> weak_obj = weakref.ref(obj)
>>> weak_obj().spam()
I'm alive!
>>> obj = "Something else"
>>> gc.collect()
35
>>> weak_obj().spam()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'spam'


यह भी देखें

संदर्भ

  1. 8.8. weakref — Weak references, The Python Standard Library
  2. "PHP: WeakReference - Manual".
  3. "प्रैक्टिकल मेमोरी प्रबंधन". developer.apple.com.
  4. Nicholas, Ethan (May 4, 2006). "कमजोर संदर्भों को समझना". java.net. Archived from the original on 2011-03-03. Retrieved October 1, 2010.
  5. Goldshtein, Zurbalev & Flatow 2012, p. 131.
  6. "WeakReference (Java Platform SE 7 )". docs.oracle.com.
  7. "सॉफ्ट रेफरेंस - एंड्रॉइड डेवलपर्स". developer.android.com.
  8. "PhantomReference (Java Platform SE 7 )". docs.oracle.com.
  9. https://web.archive.org/web/20110303225354/http://weblogs.java.net/blog/2006/05/04/understanding-weak-references Java Examples

बाहरी संबंध

सी ++

जावा

पीएचपी

पायथन