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.