2010-09-30 15 views
11

Hay varias preguntas interesantes sobre trampas con boost::shared_ptr s. En uno de ellos, existe la sugerencia útil para evitar señalar boost::shared_ptr<Base> y boost::shared_ptr<Derived> al mismo objeto del tipo Derived, ya que utilizan diferentes recuentos de referencia y pueden destruir el objeto prematuramente.Reforzar :: shared_ptr <T> y boost :: shared_ptr <const T> compartir el recuento de referencias?

Mi pregunta: ¿Es seguro tener tanto boost::shared_ptr<T> como boost::shared_ptr<const T> apuntando al mismo objeto del tipo T, o esto causará el mismo problema?

+1

¿Puede proporcionar una referencia para el reclamo Base/Derivado? – fredoverflow

+0

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

+5

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

Respuesta

18

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.

+0

Gracias, tienes toda la razón. Tuve un malentendido completamente diferente a lo largo del ejemplo de ybungalobill. ¡Gracias a los dos! – lytenyn

+1

Estaba a punto de publicar una pregunta sobre el lanzamiento de shared_pointer pero obtuve la respuesta aquí. Gracias. – rjoshi

Cuestiones relacionadas