2012-02-05 9 views
7

Al usar shared_ptr, ¿debería usar la declaración shared_ptr una sola vez o declarar shared_ptr en todos los lugares donde la paso?Al usar shared_ptr, ¿debería usar la declaración shared_ptr una sola vez o declarar shared_ptr en todos los lugares donde la paso?

lo tanto, en la función donde I nuevo a la instancia que lo envuelve en un shared_ptr pero cuando volverlo a partir de la función que también podría devolver un shared_ptr o, utilizando la get() en el shared_ptr, simplemente devuelve un puntero normal.

Así que mi pregunta es, ¿debería usar shared_ptr<myType> cuando actualizo la instancia y luego paso los punteros normales o debería pasar shared_ptr<myType> en todas partes?

Respuesta

5

Crear un shared_ptr no imbuye poderes mágicos en su objeto puntiagudo. La magia está en el shared_ptr — y sus copias —. Si deja de usarlo, pierde su conteo de referencias; peor, porque lo usaste en algún punto, el objeto se eliminará automáticamente cuando no lo esperes.

El punto entero de tener es que usted sabe que su objeto no se destruirá cuando todavía lo esté utilizando en alguna parte.

En el siguiente:

T* foo() { 
    shared_ptr<T> sp(new T()); 
    return sp.get(); 
    //^the only shared_ptr<T> referencing the obj is dead; 
    // obj is deleted; 
    // returned pointer invalid before you can even do anything with it 
} 

el puntero es válido inmediatamente.

Es posible que haya circunstancias en las que extraiga un puntero sin formato, pero estas deberían ser excepcionales. Si está en una función en la que sabe, no necesita el recuento de referencias, simplemente pase el shared_ptr como referencia.