2010-09-22 16 views
8

मैं एक गैर-संदर्भित स्मार्ट पॉइंटर चाहता हूं जो auto_ptr और shared_ptr के कुछ उपयोगी पहलुओं को जोड़ सकता है। मुझे लगता है कि सी ++ 0x का unique_ptr आखिरकार मुझे क्या चाहिए, लेकिन मुझे कुछ ऐसा चाहिए जो विजुअल स्टूडियो 2008 और एक्सकोड (जीसीसी 4.2) पर संकलित होगा।क्या कोई सामान्य स्मार्ट पॉइंटर है जैसे auto_ptr और shared_ptr जिसे C++ 0x की आवश्यकता नहीं है?

कार्यक्षमता की आवश्यकता है:

  • कारखाने तरीकों में उपयोग किए जाने योग्य है, ताकि स्वामित्व (auto_ptr) की तरह नकल पर स्थानांतरित कर रहा है
  • का समर्थन करता है release() (auto_ptr की तरह)
  • आगे घोषणा के साथ इस्तेमाल किया जा सकता (जैसे share_ptr)

तो, मुझे लगता है कि यह वास्तव में बेहतर है auto_ptr। क्या ऐसा कुछ भी है जो इसे बढ़ावा देने या कहीं और करता है (ध्यान दें: मेरे पास लोकी के चारों ओर अपने सिर को लपेटने का समय नहीं मिला है)? या मुझे बस अपना खुद का रोल करना चाहिए?

संपादित करें: मैं बस auto_ptr के बारे में अधिक पढ़ रहा है - यह लग रहा है जैसे आप आगे घोषणाओं के साथ उपयोग कर सकते हैं अगर आप यह सुनिश्चित करें कि वर्ग हैडर प्रत्येक .cpp फ़ाइल स्मार्ट के साथ शीर्ष लेख का संदर्भ देता है में शामिल है सूचक (उदाहरण के लिए GotW देखें)। किसी को भी इस पर अंगूठे का कोई सामान्य सलाह या नियम मिला है?

EDIT2: साझा_ptr कारण स्वीकार्य नहीं है क्योंकि मुझे रिलीज() विधि की आवश्यकता है क्योंकि मैं कारखाने के तरीकों को पेश करके कुछ विरासत कोड को जोड़ रहा हूं, लेकिन इसे कुछ मैन्युअल सूचक स्वामित्व कोड के साथ सह-अस्तित्व में होना है। कोडबेस के दौरान shared_ptr का उपयोग करना बहुत अच्छा होगा, लेकिन एक बड़ा काम होगा।

EDIT3: अंत में, auto_ptr नौकरी के लिए पर्याप्त था जब मैंने आगे के समावेशन के quirks की खोज की। पॉइंटर के वैकल्पिक विलोपन की अनुमति देने के लिए shared_ptr के लिए एक कस्टम डिलीटर लिखना भी दिलचस्प होगा।

+0

यह वही है जो मैं auto_ptr का उपयोग करता हूं। जब तक मैंने बूस्ट का उपयोग शुरू नहीं किया (या ऐसी परिस्थितियों में जहां मैं बूस्ट का उपयोग नहीं कर सकता)। –

+0

https://github.com/codenrun/auto_ptr_custom पर एक नज़र डालें। यह इंटरफ़ेस जैसे auto_ptr पर कस्टम डिलीटर जोड़ता है। – fizzbuzz

उत्तर

5

संपादित करें: मेरे मूल उत्तर में, मुझे यह समझने में असफल रहा कि boost::shared_ptr आपको स्वीकार्य नहीं है (शायद प्रदर्शन कारणों से)।

auto_ptr, जैसा कि आप नोट करते हैं, आगे की घोषणा का समर्थन करते हैं। आपको उन स्थानों पर संदर्भित कक्षा के लिए हेडर शामिल करने की आवश्यकता है जो auto_ptr द्वारा संदर्भित ऑब्जेक्ट को नष्ट कर सकती हैं। नोट, हालांकि, auto_ptr के अर्थशास्त्र थोड़ा क्विर्की हैं और कुछ देखभाल की आवश्यकता है।

निम्नलिखित प्रश्न के जवाब कारण है कि unique_ptr केवल के लिए C++ 0x लागू किया जा सकता सहित अधिक जानकारी के होते हैं, क्योंकि यह rvalue संदर्भ की आवश्यकता है:

unique_ptr boost equivalent?

+0

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

+0

@the_mandrill: मुझे नहीं लगता कि यह एक समस्या है। बूस्ट कस्टम deleters के लिए अनुमति देता है। आप एक कस्टम डिलीटर लिख सकते हैं जो आपके द्वारा जारी किए गए पॉइंटर्स के लिए नो-ऑप है। – MSalters

+0

यदि आप नो-ऑप कस्टम डिलीटर लिखते हैं तो क्या यह कभी भी पॉइंटर को रिलीज़ करने से नहीं रोकता है? या क्या आपका मतलब कस्टम डिलीटर है जहां आप इसे रनटाइम पर हटाने/हटाने के लिए टॉगल कर सकते हैं? –

2

सी ++ TR1 (द्वारा समर्थित आधुनिक जीसीसी और विजुअल स्टूडियो) ने shared_ptrand others (cf. Wikipedia) बनाया है। उन लोगों को ज्यादातर बूस्ट से लिया गया है जो कि किसी भी आधुनिक कंपाइलर के लिए काम करता है।

यदि आपको सख्त स्वामित्व की आवश्यकता है, तो आप scoped_ptr देख सकते हैं।

+0

दोनों _mandrill के अनुसार एक व्यवहार्य विकल्प नहीं है। shared_ptr रेफ गिनती का उपयोग करता है और scoped_ptr रिलीज का समर्थन नहीं करता है। – sellibitze

2

कुछ बॉयलरप्लेट कोड के साथ आप approximateunique_ptr सी ++ 03 में कर सकते हैं। यह एक आदर्श अनुकरण नहीं है।आपको एक और अधिक स्पष्ट move कॉल की आवश्यकता होगी, उदाहरण के लिए, स्थानीय unique_ptr वापस करने में सक्षम होने के लिए।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^