2012-07-24 19 views
9

tengo una estructura:Fundición shared_ptr <T> a shared_ptr <void>

struct Params { 
    std::shared_ptr<void> user_data; 
    /* ... */ 
}; 

quiero utilizar de esta manera:

int main() { 
    std::shared_ptr<SpecializedParams> sp(new SpecializedParams(100)); 
    Params params; 
    /* ... */ 
    params.user_data = std::static_pointer_cast<void>(sp); 
    /* ... */ 
    std::shared_ptr<SpecializedParams> sp2 = 
    std::static_pointer_cast<SpecializedParams>(
     params.user_data 
    ); 
    /* ... */ 
    return 0; 
} 

¿Es esta válida y segura?

+0

¿Qué es params en el bloque principal? –

+0

No se puede 'borrar' un puntero de vacío, por lo que su código ni siquiera debería compilarse. –

+2

@KerrekSB punteros compartidos para anular son ciertamente válidos. Consulte aquí para obtener más detalles: http://stackoverflow.com/questions/5913396/why-do-stdshared-ptrvoid-work –

Respuesta

7

El código que elimina el objeto compartido se determina cuando se crea el puntero compartido (es por eso que necesita un tipo completo al construir el shared_ptr y no al destruir el shared_ptr). Por lo tanto, incluso cuando su shared_ptr es el último puntero que apunta a su objeto SpecializedParams, el objeto se destruirá correctamente.

3

Esto debería ser seguro, ya que el elemento vacío es también shared_ptr. Agregará una referencia al elemento existente y no se lanzará hasta que el elemento vacío caduque.

+2

La razón por la que funciona es debido a la función de eliminación de datos ocultos almacenada con el objeto 'shared_ptr ' ... De lo contrario, simplemente llamar 'delete' en un puntero' void' no desasignará correctamente los recursos de memoria del objeto administrado por ' shared_ptr '. – Jason

Cuestiones relacionadas