2013-06-28 22 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()返回被摧毁,并为无效异步操作的缓冲寿命的要求。