Boosten Sie async_ * -Funktionen und shared_ptrs
Ich sehe dieses Muster häufig in Code, bindendshared_from_this
als ersten Parameter an eine Member-Funktion übergeben und das Ergebnis mit einemasync_*
Funktion. Hier ist ein Beispiel aus einer anderen Frage:
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));
}
Der einzige Grund zu benutzenshared_from_this()
anstattthis
soll das Objekt am Leben erhalten, bis die Mitgliedsfunktion aufgerufen wird. Aber es sei denn, es gibt irgendwo eine Art Boost-Magie, seit demthis
Zeiger ist vom TypConnection*
, das ist alleshandle_Receive
kann dauern, und der zurückgegebene Smart Pointer sollte sofort in einen regulären Pointer konvertiert werden. In diesem Fall gibt es nichts, was das Objekt am Leben hält. Und natürlich gibt es keinen Hinweis auf einen Anrufshared_from_this
.
Ich habe dieses Muster jedoch so oft gesehen, dass ich nicht glauben kann, dass es so völlig kaputt ist, wie es mir scheint. Gibt es eine Boost-Magie, die bewirkt, dass shared_ptr später, wenn der Vorgang abgeschlossen ist, in einen regulären Zeiger konvertiert wird? Wenn ja, ist dies irgendwo dokumentiert?
Ist irgendwo dokumentiert, dass der gemeinsame Zeiger bestehen bleibt, bis der Vorgang abgeschlossen ist? Berufungget_pointer
Es reicht nicht aus, den starken Zeiger zu aktivieren und dann die Mitgliedsfunktion für den zurückgegebenen Zeiger aufzurufen, es sei denn, der starke Zeiger wird erst zerstört, wenn die Mitgliedsfunktion zurückkehrt.