Усилить функции async_ * и shared_ptr
Я часто вижу этот шаблон в кодеshared_from_this
в качестве первого параметра для функции-члена и отправки результата с помощьюasync_*
функция. Вот пример из другого вопроса:
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));
}
Единственная причина использоватьshared_from_this()
вместоthis
поддерживать объект до тех пор, пока не будет вызвана функция-член. Но если где-то нет какой-то магии усиления, так какthis
указатель имеет типConnection*
вот и всеhandle_Receive
может взять, и возвращенный умный указатель должен быть немедленно преобразован в обычный указатель. Если это произойдет, то ничто не сможет сохранить объект живым. И, конечно, в вызове нет указателяshared_from_this
.
Однако я видел эту модель так часто, что не могу поверить, что она настолько сломана, как мне кажется. Есть ли какая-то магия Boost, которая приводит к тому, что shared_ptr будет преобразован в обычный указатель позже, когда операция завершится? Если так, это где-то задокументировано?
В частности, где-то задокументировано, что общий указатель будет существовать до завершения операции? призваниеget_pointer
на сильном указателе и последующего вызова функции-члена на возвращенном указателе недостаточно, если только сильный указатель не будет уничтожен, пока функция-член не вернется.