Zwiększ funkcje async_ * i shared_ptr

Często widzę ten wzór w kodzie, wiążącyshared_from_this jako pierwszy parametr funkcji składowej i wywołanie wyniku za pomocąasync_* funkcjonować. Oto przykład z innego pytania:

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

Jedyny powód do używaniashared_from_this() zamiastthis jest utrzymywanie obiektu przy życiu do momentu wywołania funkcji składowej. Ale jeśli nie ma gdzieś magii wzmacniającej, od czasuthis wskaźnik jest typuConnection*, to wszystkohandle_Receive może podjąć, a zwrócony inteligentny wskaźnik powinien zostać natychmiast przekonwertowany na zwykły wskaźnik. Jeśli tak się stanie, nie ma niczego, co mogłoby utrzymać obiekt przy życiu. I oczywiście nie ma wskaźnika w wywołaniushared_from_this.

Jednak tak często widziałem ten wzorzec, że nie mogę uwierzyć, że jest tak całkowicie zepsuty, jak mi się wydaje. Czy jest jakaś magia Boost, która powoduje, że shared_ptr zostanie przekonwertowany na zwykły wskaźnik później, gdy operacja się zakończy? Jeśli tak, czy jest to gdzieś udokumentowane?

W szczególności, czy jest gdzieś udokumentowane, że udostępniony wskaźnik będzie istniał do czasu zakończenia operacji? Powołanieget_pointer na silnym wskaźniku, a następnie wywołanie funkcji składowej na zwróconym wskaźniku nie jest wystarczające, chyba że silny wskaźnik nie zostanie zniszczony, dopóki nie zostanie zwrócona funkcja składowa.

questionAnswers(5)

yourAnswerToTheQuestion