Асинхронная запись в сокет. MSVC. Exception: “cannot dereference string iterator…”

164
13 января 2019, 14:10

Для сетевой части используется boost asio. На Windows(MSVC) выскакивает exception: "

Кусок кода:

void Send()
    {
        std::stringstream buffer;

async_write(*this->socket,
                        boost::asio::buffer(buffer.str()),
                        boost::bind(&Socket::HandleWrite,
                                    this,
                                    boost::asio::placeholders::error,
                                    boost::asio::placeholders::bytes_transferred));   
        }

Поверхностно я понимаю, что локальная переменная buffer уничтожается и это каким-то образом приводит к exception. Но при этом данные посылаются, потери не наблюдаю, хотя не уверен. Самое интересное, что на Linux(gcc) такого exception нету. Можете подробнее объяснить почему так происходит?

Answer 1

Ну, в общем-то вы верно понимаете, что проблема связана с тем, что строка приказывает долго жить до того, как выполняется запись ее содержимого.

Сообщение вы получаете потому, что работаете в отладочном режиме (если перейдете к релизу, этого сообщения не будет... но сама ошибка не исчезнет).

Данные посылаются потому, что это UB, и возможно, что память буфера просто еще никем не затерта в этот момент, и вы просто передаете то, что продолжает лежать по указанному адресу. Но гарантии, что оно там будет лежать всегда при вызове вашей функции - нет.

Мне удалось удовлетворить вашу любознательность? :)

READ ALSO
Как остановить на время программу? [закрыт]

Как остановить на время программу? [закрыт]

как на время остановить программу на c++?

143
Неявное поведение spring при работе с дженериками

Неявное поведение spring при работе с дженериками

Есть некая сущность Report и одна из ее реализаций:

145
Как вызвать метод java

Как вызвать метод java

Проблема в следующем, при выполнении кода метод (метод 1) вызывает другой метод (метод 2), но что-бы не увеличивать код нужно вызвать из "метода...

145