套接字读取访问冲突

问题描述 投票:0回答:1

在第二次从套接字读取时,我收到读取错误。

void ClientWindow::on_button_send_clicked()
{
    auto message = std::make_shared<std::string>(ui->plainTextEdit->toPlainText().toStdString());
    auto message_size = std::make_shared<short>(static_cast<short>(message->size()));
    if(*message_size==0)
        return;

    _socket.async_write_some(boost::asio::buffer(message_size.get(),sizeof(*message_size)),
            [this,message](const boost::system::error_code& error, std::size_t)
            {
                     if(!error){
                     emit clearPlainTextEdit();
                     qDebug()<<message->size();
                     qDebug()<<*message;
                     _socket.async_write_some(boost::asio::buffer(message->data(),message->size()),
                            [this](const boost::system::error_code& error, std::size_t)
                            {
                                if(error)
                                    emit settingStatusBarMessage(error.message() + ": sending size of message error\n");
                            });
                 }else
                      emit settingStatusBarMessage(error.message() + ": sending message error\n");
            });
}

在排队

_socket.async_write_some(boost::asio::buffer(message->data(),message->size()),
我正在传输到另一个文件
xmemory
,我在这里收到错误:

    for (auto _Pnext = _STD exchange(_Myproxy->_Myfirstiter, nullptr); _Pnext; _Pnext = _Pnext->_Mynextiter) {
        _Pnext->_Myproxy = nullptr;
    }

错误文字:

Exception at 0x7ffbd991efb, code: 0xxc0000005: read access violation at: 0xffffffffffffffff, flagx=0x0 (first chance).

据我了解,错误不在服务器端。 我按值将智能指针存储在 lambda 函数中,并在执行此操作之前检查其内容和大小,但仍然收到错误。我也尝试过使用对象属性而不是智能指针,但错误是一样的。

c++ memory boost-asio
1个回答
0
投票

消除所有噪音,很容易看到错误。

auto message = std::make_shared<std::string>(...);
auto message_size = std::make_shared<short>(...);
_socket.async_write_some(boost::asio::buffer(message_size.get(),sizeof(*message_size)),
            [this,message](...)
            {
              ...
            });

您正在异步写入

message_size
并仅捕获
message
,您需要捕获两者。

© www.soinside.com 2019 - 2024. All rights reserved.