Ускорьте асинхронные _*функции и общие _указатели

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

20
задан Sam Miller 6 July 2012 в 16:08
поделиться