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.