boost asio - управление памятью для сокетов - PullRequest
1 голос
/ 03 февраля 2012

У меня есть улучшенное серверное приложение asio, и я борюсь с тем, как передать созданные сокеты (например, передать принимающий сокет в классы реализации протокола, которые будут читать / записывать данные в будущем)

Например, еслиЯ делаю их передаваемыми shared_ptr различным классам, которые читают / пишут им, это работает.Мой сервер имеет io_service.run () перед выходом из основной программы, и все асинхронные операции, выполняемые на этих сокетах, выполняются там.

EDIT Я обнаружил, что проблема не в том,Я передавал сокет класса.Можно сохранить владение ими в классе и передать ссылку на дорогу.В моем случае один из классов соединения был уничтожен до того, как обработчик асинхронной операции завершил свою работу.

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Если я правильно понимаю ваш вопрос, я использую общий указатель для хранения данных и передачи их обработчику asio. Это пример приема UDP, но концепция аналогична и для передачи. (предупреждение написано из памяти и не скомпилировано)

typedef std::vector<uint8_t>          DATA_BUF_T;
typedef boost::shared_ptr<DATA_BUF_T> DATA_BUF_PTR_T;

void start_reading ()
{
    boost::asio::ip::udp::endpoint listen_endpoint (localAddr, usPort);

    m_socket.open (listen_endpoint.protocol());
    m_socket.bind (listen_endpoint);

    // create buffer to store received data
    DATA_BUF_PTR_T db (new DATA_BUF_T (max_length));

    m_socket.async_receive_from (
    boost::asio::buffer (*db, max_length), m_Status.peer,
    boost::bind (&handle_receive_from, this,
        db,
        boost::asio::placeholders::error, 
        boost::asio::placeholders::bytes_transferred)
    );

}


void handle_receive_from (DATA_BUF_PTR_T db,
                          const boost::system::error_code &error, 
                          size_t bytes_recvd)
{
    if (error)
    {
    return ;
    }

    // read data from db

}
1 голос
/ 03 февраля 2012

Я думаю, что этот вопрос на самом деле не имеет ничего общего с asio и может быть обобщен на «Как передать право собственности на выделенные объекты?» .

И мой ответ будет таким:Используйте std::unique_ptr (... для C ++ 11)

Если получатель unique_ptr хочет использовать другую идиому владения (например, shared_ptr), ее легко освободить из unique_ptrи превратить его в shared_ptr.Противоположность не верна.Таким образом, нет времени, когда ваш указатель сырой и может быть утечка.

...