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

From Vigyanwiki
m (Abhishek moved page कमजोर संदर्भ to अशक्त संदर्भ without leaving a redirect)
No edit summary
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>
[[कंप्यूटर प्रोग्रामिंग]] में, [[संदर्भ (कंप्यूटर विज्ञान)]] है जो संदर्भित [[वस्तु (कंप्यूटर विज्ञान)]] को [[कचरा संग्रह (कंप्यूटर विज्ञान)|गार्बेज संग्रह (कंप्यूटर विज्ञान)]] द्वारा संग्रह से सुरक्षित नहीं करता है, ठोस संदर्भ के विपरीत। वीक संदर्भों द्वारा ''मात्र'' संदर्भित वस्तु - जिसका अर्थ है कि वस्तु तक पहुंचने वाले संदर्भों की प्रत्येक श्रृंखला में लिंक के रूप में अल्प से अल्प वीक संदर्भ सम्मिलित है - इसे ''वीक पहुंच योग्य'' माना जाता है और इसे [[अगम्य स्मृति]] के रूप में माना जा सकता है और इसलिए हो सकता है किसी भी समय त्र किया जा सकता है। कुछ गार्बेज -संग्रहित भाषाएं वीक संदर्भों के विभिन्न स्तरों को प्रदर्शित करती हैं या उनका समर्थन करती हैं, जैसे सी शार्प (प्रोग्रामिंग भाषा)| सी#, [[जावा (प्रोग्रामिंग भाषा)]], [[लिस्प (प्रोग्रामिंग भाषा)]], [[ 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>




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


== कचरा संग्रह ==
== गार्बेज  संग्रह ==
{{main|Garbage collection (computer science)}}
{{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 मानक के बाद से, Boost (C++ लाइब्रेरी) लाइब्रेरी से विरासत में प्राप्त Smart_pointer#shared_ptr_and_weak_ptr|shared_ptr और Weak_ptr का उपयोग करके एक समाधान जोड़ा गया था।
गार्बेज संग्रह का उपयोग अप्रयुक्त वस्तुओं को साफ करने के लिए किया जाता है और इस प्रकार मेमोरी लीक और डेटा भ्रष्टाचार की संभावना को अल्प करता है। गार्बेज संग्रह के दो मुख्य प्रकार हैं: ट्रेसिंग और रेफरेंस काउंटिंग है। रेफरेंस काउंटिंग स्कीम किसी दिए गए ऑब्जेक्ट के संदर्भों की संख्या को रिकॉर्ड करती है और रेफरेंस काउंट शून्य होने पर ऑब्जेक्ट को कलेक्ट करती है। संदर्भ-गिनती चक्रीय (या परिपत्र) संदर्भों को एकत्र नहीं कर सकती क्योंकि  समय में मात्र वस्तु एकत्र की जा सकती है। पारस्परिक रूप से संदर्भित वस्तुओं के समूह जो सीधे अन्य वस्तुओं द्वारा संदर्भित नहीं हैं और अगम्य हैं इस प्रकार स्थायी रूप से निवासी बन सकते हैं; यदि कोई एप्लिकेशन लगातार ऐसे अगम्य समूहों को अगम्य वस्तुओं के रूप में उत्पन्न करता है, तो इसका प्रभाव [[स्मृति रिसाव]] पर पड़ेगा। यदि समूह के भीतर कुछ संदर्भों के लिए वीक संदर्भों का उपयोग करके संदर्भ चक्रों से बचा जाता है, तो वीक संदर्भ (संदर्भ जिन्हें संदर्भ गिनती में नहीं गिना जाता है) का उपयोग परिपत्र संदर्भों की समस्या को हल करने के लिए किया जा सकता है।


स्मृति में अनावश्यक वस्तुओं की संख्या को कम करने के लिए कमजोर संदर्भों का भी उपयोग किया जाता है, जिससे कार्यक्रम को यह इंगित करने की अनुमति मिलती है कि कौन सी वस्तुओं को केवल कमजोर रूप से संदर्भित करके मामूली महत्व है।{{citation needed|date=February 2023}}
इस प्रकार के ठोस बनाम वीक संदर्भ भेद का बहुत ही सामान्य स्थिति वृक्ष संरचनाओं में है, जैसे दस्तावेज़ ऑब्जेक्ट मॉडल (डीओएम), जहां माता-पिता से बच्चे के संदर्भ  ठोस हैं, लेकिन बच्चे से माता-पिता के संदर्भ वीक हैं। उदाहरण के लिए, ऐप्पल का [[कोको (एपीआई)]] ढांचा इस दृष्टिकोण की सिफारिश करता है।<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++ लाइब्रेरी) लाइब्रेरी से विरासत में प्राप्त shared_ptr और Weak_ptr का उपयोग करके समाधान जोड़ा गया था।
 
स्मृति में अनावश्यक वस्तुओं की संख्या को अल्प करने के लिए वीक संदर्भों का भी उपयोग किया जाता है, जिससे कार्यक्रम को यह इंगित करने की अनुमति मिलती है कि कौन सी वस्तुओं को मात्र वीक रूप से संदर्भित करके साधारण महत्व है।{{citation needed|date=February 2023}}


== विविधताएं ==
== विविधताएं ==


कुछ भाषाओं में कमजोर संदर्भ शक्ति के कई स्तर होते हैं। उदाहरण के लिए, जावा (प्रोग्रामिंग लैंग्वेज) में घटती ताकत, [[ कोमल संदर्भ ]], कमजोर और [[ प्रेत संदर्भ ]] रेफरेंस के क्रम में [[जावा पैकेज]] जावा प्लेटफॉर्म, 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 -->
कुछ भाषाओं में वीक संदर्भ शक्ति के कई स्तर होते हैं। उदाहरण के लिए, जावा में घटती ताकत, नरम, कमजोर और प्रेत संदर्भों के क्रम में, पैकेज 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> प्रत्येक संदर्भ प्रकार में पुन: योग्यता की एक संबद्ध धारणा होती है। गार्बेज संग्राहक (जीसी) वस्तु को निर्बाध करने के लिए यह निर्धारित करने के लिए किसी वस्तु के प्रकार की पहुंच क्षमता का उपयोग करता है। जीसी के लिए किसी ऐसी वस्तु को निर्बाध करना सुरक्षित है जो धीरे-धीरे पहुंच योग्य है, लेकिन जीसी ऐसा नहीं करने का निर्णय ले सकती है यदि उसे लगता है कि जेवीएम मेमोरी को बचा सकता है (उदाहरण के लिए जेवीएम में बहुत अधिक अप्रयुक्त हीप स्पेस है)। जैसे ही जीसी वस्तु को नोटिस करता है, जीसी वीक रूप से पहुंच योग्य वस्तु को मुक्त कर देगा। अन्य संदर्भ प्रकारों के विपरीत, प्रेत संदर्भ का पालन नहीं किया जा सकता है। दूसरी ओर, प्रेत संदर्भ कार्यक्रम को सूचित करने के लिए तंत्र प्रदान करते हैं जब किसी वस्तु को निर्बाध किया गया हो (संदर्भ कतारों का उपयोग करके अधिसूचना प्रारम्भ की जाती है)।
सी # में, कमजोर संदर्भ इस बात से अलग हैं कि वे [[वस्तु पुनरुत्थान]] को ट्रैक करते हैं या नहीं। यह भेद मजबूत संदर्भों के लिए नहीं होता है, क्योंकि वस्तुओं को [[अंतिम रूप]] नहीं दिया जाता है यदि उनके पास कोई मजबूत संदर्भ है। डिफ़ॉल्ट रूप से, सी # कमजोर संदर्भ में पुनरुत्थान को ट्रैक नहीं करते हैं, जिसका अर्थ है कि यदि कोई वस्तु पुनर्जीवित होती है तो एक कमजोर संदर्भ अद्यतन नहीं होता है; इन्हें छोटा कमजोर संदर्भ कहा जाता है, और कमजोर संदर्भ जो पुनरुत्थान को ट्रैक करते हैं उन्हें लंबे कमजोर संदर्भ कहा जाता है।{{sfn|Goldshtein|Zurbalev|Flatow|2012|p=[https://books.google.com/books?id=D3J58cs-i44C&q=resurrection&pg=PA131 131]}}


कुछ गैर-कचरा-संग्रहित भाषाएँ, जैसे कि C++, कचरा संग्रह पुस्तकालयों के समर्थन के हिस्से के रूप में कमजोर/मजबूत संदर्भ कार्यक्षमता प्रदान करती हैं। बूस्ट सी ++ लाइब्रेरी मजबूत और कमजोर संदर्भ प्रदान करती है। [[ स्मार्ट सूचक ]]्स के कमजोर समकक्षों के रूप में नियमित सी ++ पॉइंटर्स का उपयोग करना एक गलती है क्योंकि इस तरह के उपयोग से यह पता लगाने की क्षमता को हटा दिया जाता है कि मजबूत संदर्भ संख्या 0 हो गई है और ऑब्जेक्ट हटा दिया गया है। इससे भी बदतर, यह पता लगाने की अनुमति नहीं देता है कि क्या एक और मजबूत संदर्भ पहले से ही दिए गए सादे सूचक को ट्रैक कर रहा है। यह एक ही प्लेन पॉइंटर को ट्रैक करने वाले दो (या अधिक) स्मार्ट पॉइंटर्स होने की संभावना का परिचय देता है (जैसे ही इन स्मार्ट पॉइंटर्स में से एक की रेफरेंस काउंट 0 तक पहुंचता है और ऑब्जेक्ट डिलीट हो जाता है) भ्रष्टाचार का कारण बनता है।
ठोस C# में, वीक संदर्भ इस बात से भिन्न हैं कि वे [[वस्तु पुनरुत्थान]] को ट्रैक करते हैं या नहीं। यह भेद ठोस संदर्भों के लिए नहीं होता है, क्योंकि वस्तुओं को [[अंतिम रूप]] नहीं दिया जाता है यदि उनके निकट कोई ठोस संदर्भ है। डिफ़ॉल्ट रूप से, सी # वीक संदर्भ में पुनरुत्थान को ट्रैक नहीं करते हैं, जिसका अर्थ है कि यदि कोई वस्तु पुनर्जीवित होती है तो  वीक संदर्भ अद्यतन नहीं होता है; इन्हें छोटा वीक संदर्भ कहा जाता है, और वीक संदर्भ जो पुनरुत्थान को ट्रैक करते हैं उन्हें लंबे वीक संदर्भ कहा जाता है।{{sfn|Goldshtein|Zurbalev|Flatow|2012|p=[https://books.google.com/books?id=D3J58cs-i44C&q=resurrection&pg=PA131 131]}}
 
कुछ गैर- गार्बेज -संग्रहित भाषाएँ, जैसे कि C++, गार्बेज  संग्रह पुस्तकालयों के समर्थन के भाग के रूप में वीक/ ठोस संदर्भ कार्यक्षमता प्रदान करती हैं। बूस्ट सी ++ लाइब्रेरी ठोस और वीक संदर्भ प्रदान करती है। [[ स्मार्ट सूचक | स्मार्ट सूचक]] के वीक समकक्षों के रूप में नियमित सी ++ पॉइंटर्स का उपयोग करना गलती है क्योंकि इस प्रकार के उपयोग से यह ज्ञात लगाने की क्षमता को हटा दिया जाता है कि ठोस संदर्भ संख्या 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 48:
}
}
</syntaxhighlight>
</syntaxhighlight>
कमजोर संदर्भों का एक अन्य उपयोग [[कैश (कंप्यूटिंग)]] लिखने में है। उदाहरण के लिए, एक कमजोर हैश मानचित्र का उपयोग करके, एक कमजोर संदर्भ के माध्यम से विभिन्न संदर्भित वस्तुओं को कैश में संग्रहीत किया जा सकता है। जब कचरा संग्राहक चलता है - उदाहरण के लिए जब एप्लिकेशन की मेमोरी का उपयोग पर्याप्त रूप से अधिक हो जाता है - वे कैश्ड ऑब्जेक्ट जो अब अन्य ऑब्जेक्ट्स द्वारा सीधे संदर्भित नहीं होते हैं, कैश से हटा दिए जाते हैं।
[[कैश (कंप्यूटिंग)]] लिखने में वीक संदर्भों का अन्य उपयोग है। उदाहरण के लिए, वीक हैश मानचित्र का उपयोग करके, वीक संदर्भ के माध्यम से विभिन्न संदर्भित वस्तुओं को कैश में संग्रहीत किया जा सकता है। जब गार्बेज संग्राहक चलता है - उदाहरण के लिए जब एप्लिकेशन की मेमोरी का उपयोग पर्याप्त रूप से अधिक हो जाता है - वे कैश्ड ऑब्जेक्ट जो अब अन्य ऑब्जेक्ट्स द्वारा सीधे संदर्भित नहीं होते हैं, कैश से हटा दिए जाते हैं।


=== स्मालटॉक ===
=== स्मालटॉक ===
Line 81: Line 84:


=== उद्देश्य-सी 2.0 ===
=== उद्देश्य-सी 2.0 ===
[[ उद्देश्य सी ]] 2.0 में, न केवल कचरा संग्रह, बल्कि संदर्भ गणना भी कमजोर संदर्भों से प्रभावित होगी। निम्नलिखित उदाहरण में सभी चर और गुण कमजोर हैं।
[[ उद्देश्य सी ]] 2.0 में, न मात्र गार्बेज  संग्रह, किन्तु स्वचालित संदर्भ गणना भी वीक संदर्भों से प्रभावित होगी। निम्नलिखित उदाहरण में सभी चर और गुण वीक हैं।
<syntaxhighlight lang=objc>
<syntaxhighlight lang=objc>
@interface WeakRef : NSObject
@interface WeakRef : NSObject
Line 94: Line 97:
@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> संदर्भों का समर्थन करते हैं। 


=== [[वाला (प्रोग्रामिंग लैंग्वेज)]]===
=== [[वाला (प्रोग्रामिंग लैंग्वेज)]]===
Line 150: Line 153:


=== जावा ===
=== जावा ===
* [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।



Revision as of 11:04, 17 May 2023

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


उपयोग करता है

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

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

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

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

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

विविधताएं

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

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

कुछ गैर- गार्बेज -संग्रहित भाषाएँ, जैसे कि C++, गार्बेज संग्रह पुस्तकालयों के समर्थन के भाग के रूप में वीक/ ठोस संदर्भ कार्यक्षमता प्रदान करती हैं। बूस्ट सी ++ लाइब्रेरी ठोस और वीक संदर्भ प्रदान करती है। स्मार्ट सूचक के वीक समकक्षों के रूप में नियमित सी ++ पॉइंटर्स का उपयोग करना गलती है क्योंकि इस प्रकार के उपयोग से यह ज्ञात लगाने की क्षमता को हटा दिया जाता है कि ठोस संदर्भ संख्या 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


बाहरी संबंध

सी ++

जावा

पीएचपी

पायथन


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