提升ASIO async_write“Vector iterator not dereferencable”

时间:2010-04-30 21:45:10

标签: c++ boost boost-asio

我一直在研究异步升级服务器程序,到目前为止我已经将它连接起来了。但是我现在得到一个“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)

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

2 个答案:

答案 0 :(得分:0)

所有这些都取决于您的Packet类的实现方式。如何复制,.... Packet类的副本是做深拷贝还是只是默认拷贝?如果它是默认副本且您的类Packet不是POD,这可能是原因,您需要进行深层复制。

一般来说,最好通过const&amp;传递一个类参数。所以也许你应该试试

void send(Packet const& packet);

答案 1 :(得分:0)

我找到了一个解决方案,因为向量会被破坏我创建了一个包含结果数据包的队列,然后逐个处理它们,现在没有被解除引用,所以问题就解决了。

可能想要更改我的队列来保存数据包类而不是结果,但这只是一个细节。