2010-09-30 16 views
11

Il existe plusieurs questions intéressantes sur les pièges avec boost::shared_ptr s. Dans l'un d'entre eux, il y a la pointe utile pour éviter de pointer boost::shared_ptr<Base> et boost::shared_ptr<Derived> sur le même objet de type Derived car ils utilisent différents comptes de référence et pourraient détruire l'objet prématurément.Do boost :: shared_ptr <T> et boost :: shared_ptr <const T> partager le nombre de références?

Ma question: Est-il sûr d'avoir à la fois boost::shared_ptr<T> et boost::shared_ptr<const T> pointent vers le même objet de type T, ou est-ce que cela causera le même problème?

+1

Pouvez-vous fournir une référence pour la réclamation Base/Dérivée? – fredoverflow

+0

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

+5

Base/Dérive est 100% sûr. Il est dangereux d'utiliser 'get()'. Voici une situation analogue sans Base: 'shared_ptr ptr (nouveau Dérivé), ptr2 (ptr.get());' - dangereux. – ybungalobill

Répondre

18

Il est parfaitement sûr.

L'exemple de code suivant:

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

Compile et marche très bien, et est tout à fait correct. Il sort:

a: 2 
b: 2 

Les deux shared_ptr partagent le même compteur de référence.


aussi:

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

comportons de la même manière. Vous devez cependant jamais construire votre shared_ptr en utilisant une construction comme celui-ci:

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

a.get() donne le pointeur brut et perd toutes les informations sur le comptage de référence. Pour ce faire, vous allez vous retrouver avec deux shared_ptr distincts (non liés) qui utilisent le même pointeur mais des compteurs de référence différents.

+0

Merci, vous avez parfaitement raison. J'ai eu un malentendu complètement différent à l'instar de l'exemple de Ybungalobill. Merci à vous deux! – lytenyn

+1

J'étais sur le point de poser une question sur le casting shared_pointer mais j'ai obtenu la réponse ici. THX. – rjoshi