C++ 强制boost::asio::buffer按值复制
我使用boost::asio::buffer发送消息,使用C++ 强制boost::asio::buffer按值复制,c++,boost-asio,C++,Boost Asio,我使用boost::asio::buffer发送消息,使用 void Send(const std::string& messageData) { socket.async_write(boost::asio::buffer(messageData), ...); } 并且在io_服务线程的某个地方遇到“字符串迭代器不可解引用”运行时错误。创建对象变量以存储缓冲区的消息数据时: void Send(const std::string& messageData) {
void Send(const std::string& messageData)
{
socket.async_write(boost::asio::buffer(messageData), ...);
}
并且在io_服务线程的某个地方遇到“字符串迭代器不可解引用”运行时错误。创建对象变量以存储缓冲区的消息数据时:
void Send(const std::string& messageData)
{
this->tempStorage = messageData;
socket.async_write(boost::asio::buffer(this->tempStorage), ...);
}
错误从未发生过。
std::string(messageData引用的对象)几乎在Send()调用后立即被释放-boost::asio::buffer是否只存储对对象的引用?
如果是,我如何强制它按值存储数据?回答boost用户邮件列表: 如果有,它将是完全无用的,因为你没有访问 完成处理程序中的任何缓冲区 使用buffer()的方法是将引用传递给您所使用的存储 以其他方式保证产品的使用寿命 您可以将其存储在外部对象中,也可以将其存储在 `这与您所做的相同,或者通过将其绑定到完成处理程序函数中 对象本身
void onComplete(shared_ptr<std::string> s, error_code const&, size_t)
{
// do stuff
}
void send(std::string const& messageData)
{
shared_ptr<std::string> s = make_shared<std::string>(messageData);
async_send(socket, boost::asio::buffer(*s),
boost::bind(&T::onSend, this, s, _1, _2));
}
void onComplete(共享、错误、代码常量和大小)
{
//做事
}
void发送(std::string const和messageData)
{
shared_ptr s=使_共享(messageData);
异步发送(套接字,boost::asio::buffer(*s),
boost::bind(&T::onSend,this,s,_1,_2));
}
这确保缓冲区数据的生存期至少与
完成处理程序已存在。来自:
缓冲区对象对其引用的内存没有任何所有权
到应用程序负责确保内存
区域在I/O不再需要之前保持有效
活动当内存不再可用时,称为缓冲区
被宣告无效
对于接受类型为的参数的boost::asio::buffer
重载
std::vector
,返回的缓冲区对象将因任何向量而无效
同时使所有引用、指针和迭代器无效的操作
参考序列中的元素(C++Std,23.2.4)
对于接受类型为的参数的boost::asio::buffer
重载
std::basic_string
,返回的缓冲区对象无效
根据引用文件无效的规定,
引用序列元素的指针和迭代器(C++Std,
21.3)
async\u-send
callС在C++11中可以稍微缩短一点,如果我错了,请纠正我:async\u-send(socket,boost::asio::buffer(*s),[s](error\u-code-const&,size\u-t){})代码>。现在不需要创建类成员函数onComplete
@slav这里不需要字符串指针,字符串本身管理堆上的数据分配。@FranciscoAguilera确切的指针是什么意思?如果它是共享的\u ptr,那么如果没有它,std::string将在void send()
的末尾被销毁(并且在堆中分配的所有动态数据都将被释放)。是否有方法将它绑定到具有unique的完成处理程序\u ptr
?应该有吧?与相当缓慢的shared_ptr
相比,这将对性能产生积极影响。@Kenji:不幸的是,没有。您可以将捕获唯一的_ptr移到lambda中(从C++14开始),但这将使lambda本身不可复制,这违反了boost::asio关于处理程序可复制构造的要求。