2010-09-30 16 views
11

boost::shared_ptr एस के साथ pitfalls पर कई दिलचस्प सवाल हैं। उनमें से एक में, boost::shared_ptr<Base> और boost::shared_ptr<Derived> को Derived के समान ऑब्जेक्ट पर इंगित करने से बचने के लिए उपयोगी युक्ति है क्योंकि वे विभिन्न संदर्भ गणनाओं का उपयोग करते हैं और ऑब्जेक्ट को समय-समय पर नष्ट कर सकते हैं।बढ़ावा दें :: shared_ptr <T> और बढ़ावा :: shared_ptr <const T> संदर्भ संख्या साझा करें?

मेरा प्रश्न: क्या boost::shared_ptr<T> और boost::shared_ptr<const T> दोनों T के समान ऑब्जेक्ट को इंगित करना सुरक्षित है, या यह एक ही समस्या का कारण होगा?

+1

क्या आप बेस/व्युत्पन्न दावे के लिए संदर्भ प्रदान कर सकते हैं? – fredoverflow

+0

http://stackoverflow.com/questions/701456/what-are-potential-dangers-when-using-boostshared-ptr/716112#716112 – lytenyn

+5

आधार/व्युत्पन्न 100% सुरक्षित है। 'Get()' का उपयोग करना असुरक्षित है। बेस के बिना समान स्थिति यहां दी गई है: 'shared_ptr पीआरटी (नया व्युत्पन्न), ptr2 (ptr.get());' - असुरक्षित। – ybungalobill

उत्तर

18

यह पूरी तरह से सुरक्षित है।

निम्नलिखित कोड नमूना:

#include <iostream> 
#include <boost/shared_ptr.hpp> 

int main(int, char**) 
{ 
    boost::shared_ptr<int> a(new int(5)); 
    boost::shared_ptr<const int> b = a; 

    std::cout << "a: " << a.use_count() << std::endl; 
    std::cout << "b: " << b.use_count() << std::endl; 

    return EXIT_SUCCESS; 
} 

संकलित करता है तथा ठीक चलाते हैं, और पूरी तरह से सही है। यह आउटपुट:

a: 2 
b: 2 

दो shared_ptr समान संदर्भ काउंटर साझा करते हैं।


इसके अलावा

:

#include <iostream> 
#include <boost/shared_ptr.hpp> 

class A {}; 
class B : public A {}; 

int main(int, char**) 
{ 
    boost::shared_ptr<A> a(new B()); 
    boost::shared_ptr<B> b = boost::static_pointer_cast<B>(a); 

    std::cout << "a: " << a.use_count() << std::endl; 
    std::cout << "b: " << b.use_count() << std::endl; 

    return EXIT_SUCCESS; 
} 

उसी तरह व्यवहार करते हैं। हालांकि कभी नहीं इस तरह एक निर्माण का उपयोग कर अपने shared_ptr निर्माण करना होगा:

boost::shared_ptr<A> a(new B()); 
boost::shared_ptr<B> b(static_cast<B*>(a.get())); 

a.get() कच्चे सूचक देता है और संदर्भ गिनती के बारे में सभी जानकारी खो देता है। ऐसा करने से, आप दो अलग-अलग (लिंक नहीं) shared_ptr के साथ समाप्त हो जाएंगे जो एक ही सूचक लेकिन विभिन्न संदर्भ काउंटर का उपयोग करते हैं।

+0

धन्यवाद, आप बिल्कुल सही हैं। यबंगलोबिल के उदाहरण के साथ-साथ मेरी पूरी तरह से गलतफहमी थी। आप दोनों को धन्यवाद! – lytenyn

+1

मैं साझा_पोइंटर कास्टिंग करने पर एक प्रश्न पोस्ट करने वाला था लेकिन यहां जवाब मिला। धन्यवाद। – rjoshi

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