Impulsionar funções async_ * e shared_ptr's

Eu freqüentemente vejo esse padrão no código, vinculandoshared_from_this como o primeiro parâmetro para uma função de membro e despachando o resultado usando umasync_* função. Aqui está um exemplo de outra pergunta:

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));
 }

A única razão para usarshared_from_this() ao invés dethis é manter o objeto ativo até que a função de membro seja chamada. Mas a menos que haja algum tipo de mágica de impulso em algum lugar, desde othis ponteiro é do tipoConnection*, Isso é tudohandle_Receive pode levar, eo ponteiro inteligente retornado deve ser convertido em um ponteiro regular imediatamente. Se isso acontecer, não há nada para manter o objeto vivo. E, claro, não há ponteiro em chamarshared_from_this.

No entanto, tenho visto esse padrão com tanta frequência que não consigo acreditar que esteja completamente quebrado como me parece. Existe alguma magia Boost que faz com que o shared_ptr seja convertido em um ponteiro regular mais tarde, quando a operação é concluída? Em caso afirmativo, isso é documentado em algum lugar?

Em particular, está documentado em algum lugar que o ponteiro compartilhado permanecerá em existência até que a operação seja concluída? Chamandoget_pointer no ponteiro forte e, em seguida, chamando a função de membro no ponteiro retornado não é suficiente, a menos que o ponteiro forte não seja destruído até que a função de membro retorne.

questionAnswers(5)

yourAnswerToTheQuestion