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.
Pouvez-vous fournir une référence pour la réclamation Base/Dérivée? – fredoverflow
http://stackoverflow.com/questions/701456/what-are-potential-dangers-when-using-boostshared-ptr/716112#716112 – lytenyn
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