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

Ответы на вопрос(5)

Ваш ответ на вопрос