在异步boost.asio操作中使用std::string时的生存期管理
Lifetime management of std::string when used in asynchronous boost.asio operation
通常我使用共享指针来管理boost.asio.异步操作中使用的缓冲区的寿命
如果我的缓冲区是一个std::string
对象(我想这有点特别,因为它会进行一些内部引用计数),该怎么办?我是否仍然需要一个字符串对象的共享指针,并将其传递给异步操作的处理程序?或者以下内容安全吗?(为什么/为什么不?)
void handler()
{
}
void func()
{
std::ostringstream stringbuilder;
// fill stringbuilder
socket.async_send(boost::asio::buffer(stringbuilder.str()), boost:bind(handler));
}
即使std::string
可能被内部引用计数,std::string
管理的底层内存在整个异步操作期间必须保持有效。它最早可以被销毁是在处理程序开始时。通常,shared_ptr
用于延长缓冲区的寿命,以便在整个异步操作中保持有效。
根据文件:
包含要写入的数据的一个或多个缓冲区。尽管缓冲区对象可以根据需要进行复制,但底层内存块的所有权由调用方保留,调用方必须保证它们在调用处理程序之前保持有效。
在这种特殊情况下,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(...)
语句返回,从stringbuilder.str()
返回的临时std::string
将被销毁,并使异步操作的缓冲区的生存期要求无效。
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- 如何维护资源管理器项目视图中当前可见的项目列表
- std中有类似find_last_of的函数,而string中没有
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 使用 std::string () const 函数启动线程或未来
- 资源管理设计模式
- 使用"Task"函数指针队列定义作业管理器
- 使用char类型将decimal转换为string,将string转换为decimal
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 将向量解析<string>为字符串
- 实现动态插件管理器
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 类显示管理器:矢量<string>
- 在异步boost.asio操作中使用std::string时的生存期管理