Повышение ASIO async_write "Вектор итератор не разыменовывается" - PullRequest
2 голосов
/ 01 мая 2010

Я работал над программой для асинхронного ускоренного сервера, и до сих пор у меня есть ее для подключения. Однако теперь я получаю сообщение об ошибке «Итератор вектора не разыменован».

Я подозреваю, что вектор уничтожается или разыменовывается перед отправкой пакета, вызывая ошибку.

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)

Не в связи с этой проблемой, но с точки зрения производительности.

Ответы [ 2 ]

0 голосов
/ 03 мая 2010

Я нашел решение, так как вектор будет уничтожен, я создал очередь, которая содержит полученные пакеты, и они обрабатываются один за другим, теперь ничто не разыменовывается, поэтому проблема решена.

может захотеть изменить мою очередь, чтобы она содержала класс пакета вместо результата, но это только деталь.

0 голосов
/ 01 мая 2010

Все это зависит от того, как реализован ваш класс Packet. Как это копируется, .... Делает ли копия класса Packet глубокую копию или просто копию по умолчанию? если это копия по умолчанию и ваш класс Packet не является POD, это может быть причиной, и вам нужно будет сделать глубокую копию.

В общем случае лучше передать параметр класса по const, поэтому, возможно, вам следует попробовать

void send(Packet const& packet);
...