2010-09-30 5 views
11

Es gibt einige interessante Fragen zu Fallstricken mit boost::shared_ptr s. In einem von ihnen gibt es den nützlichen Tipp, um boost::shared_ptr<Base> und boost::shared_ptr<Derived> auf das gleiche Objekt vom Typ Derived zu vermeiden, da sie unterschiedliche Referenzzählungen verwenden und das Objekt möglicherweise vorzeitig zerstören.Boost :: shared_ptr <T> und boost :: shared_ptr <const T> teilen Sie die Referenzzahl?

Meine Frage: Ist es sicher, dass sowohl boost::shared_ptr<T> als auch boost::shared_ptr<const T> auf dasselbe Objekt vom Typ T zeigen, oder wird dies das gleiche Problem verursachen?

+1

Können Sie eine Referenz für den Basis/abgeleiteten Anspruch angeben? – fredoverflow

+0

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

+5

Basis/Ableiten ist 100% sicher. Es ist unsicher, 'get()' zu verwenden. Hier ist analoge Situation ohne Base: 'shared_ptr ptr (neu abgeleitet), ptr2 (ptr.get());' - unsicher. – ybungalobill

Antwort

18

Es ist vollkommen sicher.

Das folgende Codebeispiel:

#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; 
} 

Kompiliert und gut laufen, und ist vollkommen richtig. Es gibt:

a: 2 
b: 2 

Das beide shared_ptr den gleichen Referenzzähler.


auch:

#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; 
} 

gleich verhalten. Sie müssen jedoch nie bauen Sie Ihre shared_ptr ein Konstrukt wie folgt aus:

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

a.get() den Rohzeiger gibt und verliert alle Informationen über Referenzzählung. Auf diese Weise erhalten Sie zwei eindeutige (nicht verknüpfte) shared_ptr, die denselben Zeiger, aber unterschiedliche Referenzzähler verwenden.

+0

Danke, du hast vollkommen recht. Ich hatte ein völlig anderes Missverständnis, wie es bei ybungalobill der Fall ist. Danke euch beiden! – lytenyn

+1

Ich wollte gerade eine Frage zum Casting von shared_pointer stellen, bekam aber die Antwort hier. Danke. – rjoshi