Я часто вижу этот шаблон в коде, привязывая 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, которая заставляет общий _ptr преобразовываться в обычный указатель позже, когда операция завершится? Если да, то это где-то задокументировано?
В частности, документировано ли где-нибудь, что общий указатель будет существовать до завершения операции? Вызова get_pointer
для строгого указателя, а затем вызова функции-члена для возвращенного указателя недостаточно, если только сильный указатель не будет уничтожен до тех пор, пока функция-член не вернется.