2012-02-03 56 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 

}