Pasando punteros compartidos como argumentos

Si declaro un objeto envuelto en un puntero compartido:

std::shared_ptr<myClass> myClassObject(new myClass());

luego quise pasarlo como argumento a un método:

DoSomething(myClassObject);

//the called method
void DoSomething(std::shared_ptr<myClass> arg1)
{
   arg1->someField = 4;
}

¿Lo anterior simplemente incrementa el recuento de referencias de shared_pt y todo está bien? ¿O deja un puntero que cuelga?

¿Todavía se supone que debes hacer esto ?:

DoSomething(myClassObject.Get());

void DoSomething(std::shared_ptr<myClass>* arg1)
{
   (*arg1)->someField = 4;
}

Creo que la segunda forma puede ser más eficiente porque solo tiene que copiar 1 dirección (a diferencia de todo el puntero inteligente), pero la primera forma parece más legible y no anticipo los límites de rendimiento. Solo quiero asegurarme de que no haya nada peligroso en ello.

Gracias.

Respuestas a la pregunta(4)

Su respuesta a la pregunta