C++ Boost ASIO分散聚集I/O导致神秘的内存错误

C++ Boost ASIO分散聚集I/O导致神秘的内存错误,c++,boost,boost-asio,C++,Boost,Boost Asio,我希望通过TCP发送多个字符串,而不首先将它们组合成一个大字符串,据我所知,ASIO的分散-聚集I/O接口可以做到这一点。然而,我一定是做错了什么,因为我的实现一直在运行内存错误。当Itelnet localhost 11211时,下面的代码段(可编译和可运行)返回一个乱码字符串: #include <vector> #include <string> #include <boost/asio.hpp> using namespace std; using

我希望通过TCP发送多个字符串,而不首先将它们组合成一个大字符串,据我所知,ASIO的分散-聚集I/O接口可以做到这一点。然而,我一定是做错了什么,因为我的实现一直在运行内存错误。当I
telnet localhost 11211
时,下面的代码段(可编译和可运行)返回一个乱码字符串:

#include <vector>
#include <string>
#include <boost/asio.hpp>

using namespace std;
using namespace boost::asio;
using namespace boost::asio::ip;

int main() {
    io_service service;
    tcp::acceptor acceptor(service, tcp::endpoint(tcp::v4(), 11211));
    tcp::socket sock(service);
    acceptor.accept(sock);
    if (!acceptor.is_open()) return 1;
    string s = "this is a really long string";
    vector<const_buffer> vec;
    vec.push_back(buffer(s));
    write(sock, buffer(vec));
}
#包括
#包括
#包括
使用名称空间std;
使用名称空间boost::asio;
使用名称空间boost::asio::ip;
int main(){
io_服务;
tcp::acceptor-acceptor(服务,tcp::端点(tcp::v4(),11211));
tcp::socketsock(服务);
接受者。接受(短袜);
如果(!acceptor.is_open())返回1;
string s=“这是一个非常长的字符串”;
向量向量机;
向量推回(缓冲器);
写入(sock,buffer(vec));
}

然而,当我写(sock,buffer(“这是一个很长的字符串”)时,它工作得很好。这里缺少什么?

在这种情况下,您不需要传递缓冲区来写入。 如果您将示例的最后一个字符串重写为

write(sock, vec);

问题最有可能得到解决。

最后一行应该是:

write(sock, vec);
否则它不是“分散-聚集”,因为
buffer
free函数总是返回
mutable\u buffers\u 1
,即单个缓冲区。在您的情况下,将调用以下
缓冲区
重载:

template <typename PodType, typename Allocator>
inline mutable_buffers_1 buffer(std::vector<PodType, Allocator>& data)
{
  return mutable_buffers_1(mutable_buffer(data.size() ? &data[0] : 0, data.size() * sizeof(PodType)));
}
模板
内联可变缓冲区\u 1缓冲区(标准::向量和数据)
{
返回可变缓冲区(可变缓冲区(data.size()?&data[0]:0,data.size()*sizeof(PodType));
}

由于您的向量不是“POD向量”,因此处理不正确。

检查
缓冲区
参考他们使用的示例有ASIO缓冲区向量,而不是数据向量。也许你可以试试看?@JoachimPileborg:我之前确实试过。示例已更新为使用该方法,但仍然以同样的方式失败。我假设
缓冲区
是幂等的,但我猜它不是一个复制构造函数,因此不应该有这种行为。非常感谢你@int3 IMHO,这样的代码根本不应该编译。我将向ASIO提交相关补丁。