Es perfectamente seguro.
El siguiente ejemplo de código:
#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;
}
Compila y ejecuta bien, y es perfectamente correcto. Salidas:
a: 2
b: 2
Las dos shared_ptr
comparten el mismo contador de referencia.
también:
#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;
}
se comportan de la misma manera. Debe, sin embargo nunca se construir su shared_ptr
usando una construcción como esta:
boost::shared_ptr<A> a(new B());
boost::shared_ptr<B> b(static_cast<B*>(a.get()));
a.get()
da el puntero del crudo y pierde toda la información sobre el conteo de referencia. Al hacer esto, terminará con dos shared_ptr
distintos (no vinculados) que usan el mismo puntero pero diferentes contadores de referencia.
¿Puede proporcionar una referencia para el reclamo Base/Derivado? – fredoverflow
http://stackoverflow.com/questions/701456/what-are-potential-dangers-when-using-boostshared-ptr/716112#716112 – lytenyn
Base/Derivar es 100% seguro. No es seguro usar 'get()'. Aquí hay una situación análoga sin Base: 'shared_ptr ptr (new Derived), ptr2 (ptr.get());' - inseguro. –
ybungalobill