通常我使用this技术使用共享指针来管理在使用boost.asio的异步操作中使用的缓冲区的生命周期。
如果我的缓冲区是std::string
对象怎么办(我觉得它有点特殊,因为它会进行一些内部引用计数等)?我还需要一个字符串对象的共享指针,我将其传递给异步操作的处理程序吗?或者以下安全吗? (为什么/为什么不呢?)
void handler()
{
}
void func()
{
std::ostringstream stringbuilder;
// fill stringbuilder
socket.async_send(boost::asio::buffer(stringbuilder.str()), boost:bind(handler));
}
答案 0 :(得分:2)
即使std::string
可能在内部引用计数,std::string
管理的基础内存在整个异步操作期间也必须保持有效。最早可以销毁的是处理程序的开头。通常,shared_ptr
用于延长缓冲区的生命周期,以便在整个异步操作期间保持有效。
包含要写入的数据的一个或多个缓冲区。尽管可以根据需要复制buffers对象,但调用者仍保留底层内存块的所有权,这必须保证它们在调用处理程序之前保持有效。
在这种特殊情况下,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::string
返回的临时stringbuilder.str()
被销毁,并使异步操作缓冲区的生存期要求无效。