Boost async_ * funciones y shared_ptr's

Con frecuencia veo este patrón en código, vinculanteshared_from_this como el primer parámetro de una función miembro y el envío del resultado mediante unaasync_* función. Aquí hay un ejemplo de otra pregunta:

void Connection::Receive()
{
     boost::asio::async_read(socket_,boost::asio::buffer(this->read_buffer_),
        boost::bind(&Connection::handle_Receive, 
           shared_from_this(),
           boost::asio::placeholders::error,
           boost::asio::placeholders::bytes_transferred));
 }

La única razón para usarshared_from_this() en lugar dethis es mantener el objeto vivo hasta que se llame a la función miembro. Pero a menos que haya algún tipo de magia de impulso en algún lugar, ya que lathis el puntero es de tipoConnection*, eso es todohandle_Receive puede tomar, y el puntero inteligente devuelto debe convertirse inmediatamente a un puntero normal. Si eso sucede, no hay nada para mantener vivo el objeto. Y, por supuesto, no hay puntero en llamar.shared_from_this.

Sin embargo, he visto este patrón tan a menudo, no puedo creer que esté tan completamente roto como me parece. ¿Existe alguna magia Boost que haga que shared_ptr se convierta en un puntero normal más adelante, cuando se complete la operación? Si es así, ¿está esto documentado en alguna parte?

En particular, ¿se documenta en algún lugar que el puntero compartido seguirá existiendo hasta que se complete la operación? Vocaciónget_pointer en el puntero seguro y luego llamar a la función miembro en el puntero devuelto no es suficiente a menos que el puntero fuerte no se destruya hasta que la función miembro regrese.

Respuestas a la pregunta(5)

Su respuesta a la pregunta