दिलचस्प पोस्ट
प्रस्तुत करने के लिए फार्म ताज़ा पृष्ठ रोकें अस्तित्व का उपयोग करते हुए उपचर 1 या मौजूद है * क्या टीएलएस 1.2 के एनटीटी कार्यान्वयन हैं? तार की एक सरणी पर jQuery.unique जावा में 2 दशमलव स्थानों तक गोल? IntelliJ IDEA में गलत मैनिफेस्ट.एमए बनाया .jar कंटेनर व्यू नियंत्रक उदाहरण क्या किसी थ्रेड (थ्रेड। अपॉर्टेन्ट विधि) को छोड़ने जैसे कार्य को रद्द करना संभव है? कैसे एक अद्वितीय कॉलम पर एक अद्वितीय सूचकांक बनाने के लिए? विजुअल स्टूडियो IDE में XSD के साथ एक्सएमएल सत्यापन सी 99 में, एफ () + जी () अपरिभाषित या केवल अनिर्दिष्ट है? डीबी 2 में "डालें या अद्यतन" कथन है? "क्रैक। एनएटी रनटाइम में आंतरिक त्रुटि" के साथ एप्लिकेशन क्रैश मैं बच्चे वर्ग के नाम को जानने के बिना किसी वस्तु के बाल वर्गों को कैसे उपयोग कर सकता हूं? मेरे स्थानीय परिवर्तनों के बारे में गिट पर त्रुटि को कैसे अनदेखा करना मर्ज द्वारा ओवरराइट किया जाएगा?

संकेतक, स्मार्ट पॉइंटर्स या साझा पॉइंटर?

मैं सामान्य संकेतकों के साथ प्रोग्रामिंग कर रहा हूं, लेकिन मैंने पुस्तकालयों जैसे बूस्ट जैसे स्मार्ट पॉइंटर्स को लागू करने के बारे में सुना है मैंने यह भी देखा है कि ओग्रे 3 डी रेंडरिंग इंजन में साझा पॉइंटर्स का गहरा उपयोग है।

तीनों के बीच में अंतर क्या है, और क्या मैं उन्हें सिर्फ एक प्रकार का उपयोग करने पर रोक सकता हूं?

वेब के समाधान से एकत्रित समाधान "संकेतक, स्मार्ट पॉइंटर्स या साझा पॉइंटर?"

सिडियस ने काफी अच्छी तरह से प्रकार की रूपरेखा:

  • सामान्य संकेत केवल यही हैं – वे स्मृति में कुछ चीज़ को इंगित करते हैं कहीं कौन मालिक है? केवल टिप्पणियां आपको बताएगी। कौन इसे मुक्त करता है? उम्मीद है कि मालिक किसी बिंदु पर
  • स्मार्ट पॉइंटर्स एक कंबल शब्द हैं जो कई प्रकारों को कवर करते हैं; मुझे लगता है कि आप का अर्थ स्कॉइड सूचक है जो आरएआईआई पैटर्न का उपयोग करता है। यह एक स्टैक-आवंटित ऑब्जेक्ट है जो एक सूचक को लपेटता है; जब यह गुंजाइश से बाहर निकलता है, तो वह उस पॉइंटर पर हट जाता है जिसे वह लपेटता है। यह समाहित संकेतक का "मालिक" है, इसमें किसी बिंदु पर इसे हटाने का आरोप है। वे आपको अन्य तरीकों से गुजारने के लिए सूचक के लिए एक कच्चा संदर्भ प्राप्त करने की अनुमति देते हैं, साथ ही सूचक को जारी करते हैं, जिससे किसी और को खुद के मालिक हो सकते हैं। उन्हें प्रतिलिपि बनाना नहीं है।
  • साझा पॉइंटर्स एक स्टैक-ऑब्जेक्ट ऑब्जेक्ट है जो एक पॉइंटर को लपेटता है ताकि आप को यह जानने की जरूरत न हो कि यह किसका मालिक है जब स्मृति में किसी ऑब्जेक्ट के अंतिम साझा सूचक को नष्ट कर दिया जाता है, तो लिपटे सूचक को भी हटा दिया जाएगा।

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

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

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

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

शब्द "स्मार्ट पॉइंटर" में साझा पॉइंटर्स, ऑटो पॉइंटर्स, लॉकिंग पॉइंटर्स और अन्य शामिल हैं। आप का मतलब ऑटो पॉइंटर (अधिक अस्पष्ट रूप से "मालिकिंग पॉइंटर" के रूप में जाना जाता है), स्मार्ट पॉंटर नहीं है।

गूंगा संकेत (टी *) सबसे अच्छा समाधान कभी नहीं हैं वे आपको स्पष्ट मेमोरी प्रबंधन करते हैं, जो वर्बोज़, त्रुटि प्रवण, और कभी-कभी असंभव हो। लेकिन इससे भी महत्वपूर्ण बात, वे आपका इरादा संकेत नहीं करते

ऑटो पॉइंटर्स पॉइन्टी को विनाश में हटा देते हैं। सरणियों के लिए, वेक्टर और डेक जैसे encapsulates पसंद करते हैं। अन्य वस्तुओं के लिए, उन्हें ढेर पर रखने की बहुत कम कोशिश होती है – बस स्थानीय लोगों और ऑब्जेक्ट संरचना का उपयोग करें फिर भी ऑटो पॉइंटर्स की आवश्यकता होती है जो फ़ंक्शनों के साथ उठती है जो ढेर संकेतों को वापस करती हैं – जैसे कि कारखानों और बहुउद्देशीय रिटर्न

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

साझा पॉइंटर्स के लिए आवश्यक समकक्ष के लिए, कमजोर संकेत भी देखें

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

स्मृति लीक से बचने के लिए जब भी आप कर सकते हैं स्मार्ट पॉइंटर्स का उपयोग कर सकते हैं। सी ++ में मूल रूप से 2 अलग-अलग स्मार्ट पॉइंटर्स हैं

  • संदर्भ गिना गया (उदाहरण के लिए बढ़ावा :: shared_ptr / std :: tr1: shared_ptr)
  • गैर संदर्भ गिना (जैसे बढ़ावा :: scoped_ptr / std :: auto_ptr)

मुख्य अंतर यह है कि संदर्भ गिनती गई स्मार्ट पॉइंटर्स को कॉपी किया जा सकता है (और स्टडी :: कंटेनरों में इस्तेमाल किया जा सकता है) जबकि scoped_ptr नहीं कर सकता। गैर संदर्भ गिनती किए गए संकेतकों के पास लगभग कोई ऊपरी या कोई ऊपरी भाग नहीं है। संदर्भ गणना हमेशा किसी प्रकार के ओवरहेड का परिचय करती है।

(मैं auto_ptr से बचने का सुझाव देता हूं, गलत तरीके से उपयोग किए जाने पर कुछ गंभीर दोष हैं)

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