Boost ASIO async_write“Vector iterator not derefereenable”

问题描述:

我一直在做一个异步boost服务器程序,到目前为止我已经把它连接起来了。不过,我现在正在得到一个“矢量迭代器不可忽略”的错误。Boost ASIO async_write“Vector iterator not derefereenable”

我怀疑矢量在数据包发送前被破坏或解除引用,从而导致错误。

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.write()返回一个uint8_t矢量

难道问题,如果我想在关系改变

void send(Packet packet) 

void send(Packet& packet) 

没有到这个问题,但性能明智的。

试试我已经找到了解决方案,作为载体将被摧毁我做了一个包含产生的队列数据包和他们一个接一个地处理,现在没有任何东西被解除引用,所以问题就解决了。

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

这一切都取决于你的Packet类是如何实现的。它是如何被复制的,...... Packet包的拷贝是做一个深拷贝还是只是一个默认拷贝?如果它是默认拷贝,并且您的类Packet不是POD,这可能是原因,并且您需要进行深层拷贝。

一般来说,最好是通过以const &类参数所以也许你应该

void send(Packet const& packet);