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