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