提升asio - 套接字类的内存管理

时间:2012-02-03 11:59:03

标签: c++ boost network-programming boost-asio

我有一个提升asio服务器应用程序,我正在努力如何传输创建的套接字(例如,将接受套接字传输到将在未来读取/写入数据的协议实现类)

例如,如果我将它们通过shared_ptr传输到读取/写入它们的不同类,则可以解决这个问题。我的服务器在退出主程序之前有一个io_service.run(),并且在那里执行了对这些套接字执行的所有异步操作。

编辑我发现问题不是我传输套接字类的方式。可以在课堂上保留这些内容的所有权,并将参考传递到路上。在我的情况下,其中一个连接类在异步操作处理程序完成其工作之前被销毁。

2 个答案:

答案 0 :(得分:1)

我认为这个问题实际上与asio无关,可以通用化为“我应该如何转让已分配对象的所有权?”

我的答案是:使用std::unique_ptr (...对于C ++ 11)

如果unique_ptr的接收者想要使用其他所有权习惯用法(例如shared_ptr),则很容易从unique_ptr释放并将其转换为shared_ptr。反之则不然。这样,你的指针就没有时间可以被泄露了。

答案 1 :(得分:1)

如果我正确理解你的问题,我使用共享指针来存储数据并将其传递给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

}