我一直在研究异步升级服务器程序,到目前为止我已经将它连接起来了。但是我现在得到一个“Vector iterator not dereferencable”错误。
我怀疑在数据包被发送之前,矢量被破坏或解除引用,从而导致错误。
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;
}
一旦建立连接,就会调用Start。 packet.write()返回一个uint8_t向量
如果我改变
会有什么关系吗?void send(Packet packet)
到
void send(Packet& packet)
与此问题无关,但与性能有关。
答案 0 :(得分:0)
所有这些都取决于您的Packet类的实现方式。如何复制,.... Packet类的副本是做深拷贝还是只是默认拷贝?如果它是默认副本且您的类Packet不是POD,这可能是原因,您需要进行深层复制。
一般来说,最好通过const&amp;传递一个类参数。所以也许你应该试试
void send(Packet const& packet);
答案 1 :(得分:0)
我找到了一个解决方案,因为向量会被破坏我创建了一个包含结果数据包的队列,然后逐个处理它们,现在没有被解除引用,所以问题就解决了。
可能想要更改我的队列来保存数据包类而不是结果,但这只是一个细节。