C++ Boost ASIO异步“U写”;“向量迭代器不可解引用”;

C++ Boost ASIO异步“U写”;“向量迭代器不可解引用”;,c++,boost,boost-asio,C++,Boost,Boost Asio,我一直在开发一个异步boost服务器程序,到目前为止,我已经把它连接起来了。然而,我现在得到一个“向量迭代器不可解引用”错误 我怀疑向量在数据包被发送之前被破坏或取消引用,从而导致错误 void start() { Packet packet; packet.setOpcode(SMSG_PING); send(packet); } void send(Packet packet) { cout << "DEBUG> Transferring

我一直在开发一个异步boost服务器程序,到目前为止,我已经把它连接起来了。然而,我现在得到一个“向量迭代器不可解引用”错误

我怀疑向量在数据包被发送之前被破坏或取消引用,从而导致错误

void start()
{
    Packet packet;
    packet.setOpcode(SMSG_PING);
    send(packet);
}

void send(Packet packet)
{
    cout << "DEBUG> Transferring packet with opcode " << packet.GetOpcode() << endl;
    async_write(m_socket, buffer(packet.write()), boost::bind(&Session::writeHandler, shared_from_this(), placeholders::error, placeholders::bytes_transferred));
}

void writeHandler(const boost::system::error_code& errorCode, size_t bytesTransferred)
{
    cout << "DEBUG> Transfered " << bytesTransferred << " bytes to " << m_socket.remote_endpoint().address().to_string() << endl;
}


这与此问题无关,但与性能有关。

所有这些都取决于您的数据包类是如何实现的。它是如何被复制的。。。。Packet类的副本是深度副本还是默认副本?如果它是一个默认副本,而您的类数据包不是一个POD,这可能是原因,您需要进行深度复制

一般来说,最好通过const传递类参数&因此,也许您应该尝试使用

void send(Packet const& packet);

所有这些都取决于包类的实现方式。它是如何被复制的。。。。Packet类的副本是深度副本还是默认副本?如果它是一个默认副本,而您的类数据包不是一个POD,这可能是原因,您需要进行深度复制

一般来说,最好通过const传递类参数&因此,也许您应该尝试使用

void send(Packet const& packet);

我已经找到了一个解决方案,因为向量会被破坏,我创建了一个队列,其中包含生成的数据包,并对它们逐一进行处理,现在没有任何数据被解引用,所以问题得到了解决


可能希望更改队列以保留数据包类而不是结果,但这只是一个细节。

我找到了一个解决方案,因为向量会被破坏,我创建了一个包含结果数据包的队列,并对其逐一进行处理,现在没有任何内容被取消引用,因此问题得以解决

可能希望更改队列以保存数据包类而不是结果,但这只是一个细节

void send(Packet const& packet);