2013-06-28 50 views
0

通常我使用this技術使用共享指針來管理與boost.asio異步操作中使用的緩衝區的生命週期。在異步boost.asio操作中使用std :: string的生命週期管理

如果我的緩衝區是std::string對象(我猜這有點特別,因爲它會執行一些內部引用計數)會怎麼樣?我是否還需要一個字符串對象的共享指針,我將其傳遞給異步操作的處理程序?或者是以下安全? (爲什麼/爲什麼不?)

void handler() 
{ 
} 

void func() 
{ 
    std::ostringstream stringbuilder; 
    // fill stringbuilder 

    socket.async_send(boost::asio::buffer(stringbuilder.str()), boost:bind(handler)); 
} 

回答

2

即使std::string可以內部參考計數,由std::string管理底層的存儲器必須在整個非同步操作的持續時間保持有效。最早可以銷燬的是處理程序的開始。通常,shared_ptr用於延長緩衝區的生存期,以便在整個異步操作中保持有效。

documentation

包含數據

一個或多個緩衝器被寫入。儘管可以根據需要複製緩衝區對象,但調用者仍保留底層內存塊的所有權,必須保證它們在調用處理程序之前保持有效。

在這種特殊情況下,boost::asio::buffer()取參考字符串。因此,任何內部參考計數都不會發生。

template< 
    typename Elem, 
    typename Traits, 
    typename Allocator> 
const_buffers_1 buffer(
    const std::basic_string< Elem, Traits, Allocator > & data); 

一旦socket.async_send(...)語句返回,臨時std::stringstringbuilder.str()返回被摧毀,併爲無效異步操作的緩衝壽命的要求。