C++ 强制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) {

我使用boost::asio::buffer发送消息,使用

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关于处理程序可复制构造的要求。