2012-02-03 29 views
1

我有一个提升asio服务器应用程序,我正在努力如何传输创建的套接字(例如传输接受套接字到协议实现类,将读/写数据的道路)boost asio - 套接字类的内存管理

例如,如果我让它们通过shared_ptr传输到不同的读取/写入它们的类中,它就会生效。我的服务器在退出主程序之前有一个io_service.run(),并且在那里执行在这些套接字上完成的所有异步操作。

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

+0

还有相当有关对象的寿命好的视频教程(并对其进行管理),通过ASIO制作者在制作:[思考异步:设计应用程序与升压短耳]( http://blip.tv/boostcon/thinking-asynchronously-designing-applications-with-boost-asio-5250947) – Ghita 2012-02-05 08:12:42

回答

1

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

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

如果unique_ptr的接收者要使用不同的所有权成语(如shared_ptr)可以很容易地从释放unique_ptr并将它变成shared_ptr。相反是不正确的。这样,你的指针就没有时间了,而且可能会泄漏。

+1

我发现,如你所说,问题出现在其他地方,只是当我使用shared_ptr时,它们被伪装了。 – Ghita 2012-02-03 13:17:13

+0

处理不同asio对象的生命周期必须小心,因为在使用异步函数时,事情变得更加复杂。 – Ghita 2012-02-03 13:18:18

+0

被接受为答案,因为它指出它不是特定问题。 – Ghita 2012-02-03 21:45:41

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 

}