2009-01-19 4 views
5

Estoy usando los punteros compartidos de boost, y enable_shared_from_this para habilitar la devolución de un puntero compartido a esto. Código es el siguiente:boost weak_ptr_cast en shared_from_this()

class foo : public boost::enable_shared_from_this<foo> 
{ 
    boost::shared_ptr<foo> get() 
    { 
    return shared_from_this(); 
    } 
} 

¿Por qué shared_from_this lanzar una excepción weak_ptr_cast?

Respuesta

8

Si declaró foo en la pila, para que no haya otros punteros compartidos para foo. Por ejemplo:

void bar() 
{ 
    foo fooby; 
    fooby.get(); 
} 

fooby.get() podría emitir la excepción weak_ptr_cast.

Para evitar esto, declaran fooby en el montón:

void bar() 
{ 
    boost::shared_ptr<foo> pFooby = boost::shared_ptr<foo>(new foo()); 
    pFooby->get(); 
} 

Otra posibilidad es que usted está tratando de utilizar shared_from_this antes de que termine el constructor, que se volverá a tratar de devolver un puntero compartida que doesn todavía existen

+1

Llamar 'shared_from_this()' del constructor es probablemente * la * razón por la cual 'shared_from_this()' falla (me refiero al desarrollo, no en el código de producción, por supuesto). Lamentablemente, la mejor solución (¿solo?) Parece ser la construcción en dos fases (con todas sus desventajas). –

Cuestiones relacionadas