【问题标题】:Boost ASIO async_write "Vector iterator not dereferencable"Boost ASIO async_write “向量迭代器不可解引用”
【发布时间】:2010-04-30 21:45:09
【问题描述】:

我一直在开发一个异步增强服务器程序,到目前为止我已经将它连接起来。但是,我现在收到“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)

与这个问题无关,但在性能方面。

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

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

    一般来说,通过 const& 传递一个类参数会更好,所以也许你应该尝试一下

    void send(Packet const& packet);
    

    【讨论】:

      【解决方案2】:

      我找到了一个解决方案,因为向量会被破坏,所以我创建了一个包含结果数据包的队列,并且它们被一个一个地处理,现在没有任何东西被取消引用,所以问题得到了解决。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-29
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多