bad_weak_ptr с улучшенным умным указателем - PullRequest
0 голосов
/ 15 декабря 2018

Я разрабатываю настольный чат с boost asio и beast (для поддержки браузера).

Я использую эту архитектуру: enter image description here

Но при сборкеУ меня проблема: bad_weak_ptr, я не знаю, что не так: s Здесь ссылка на источник https://onlinegdb.com/BkFhDGHe4

Update1 : я убрал функцию run () в конструктори переместите его в функцию handle_accept, класс tcp_server.например:

void tcp_server::handle_accept(const boost::system::error_code ec, websocket_session_ptr new_websocket) { if (!ec) { // Happens when the timer closes the socket if(ec == boost::asio::error::operation_aborted) return; new_websocket->run(); //Here chatwebsocketsessionpointer session = chat_websocket_session::create(room, new_websocket); room->join(session); wait_for_connection(); } } Я вижу, что chat_webocket_session удален, но все еще есть проблема с bad_weak_ptr

Обновление 2: Я обнаружил, в чем проблема.Если я никогда не вызываю функцию do_read (), ошибки не возникает, и я могу подключиться к серверу с помощью ws. Если я вызываю ее в wait_for_data из класса chat_websoket_session, у меня возникает проблема.Поэтому я должен найти способ вызова do_read ()

Обновление 3: Если я сделаю websocket_session_ptr new_websocket(new websocket_session(std::move(socket))); acceptor.async_accept( socket, boost::bind( &tcp_server::websocket_accept, this, boost::asio::placeholders::error, new_websocket ));

, сделав ссылку на: Пример увеличения зверя websocket , Сначала я принимаю сокет, а после того, как принимаю веб-сокет с m_ws.async_accept(), но теперь у меня есть Bad file descriptor, что означает, что сокет не открыт.

PS: я обновляю ide URL (онлайн-отладчик GDB)

1 Ответ

0 голосов
/ 15 декабря 2018

Вы используете общий указатель на это из конструктора:

websocket_session::websocket_session(tcp::socket socket)
        : m_ws(std::move(socket))
        , strand(socket.get_executor())
{
    run();
}

Внутри run() вы делаете

void websocket_session::run() {
    // Accept the websocket handshake
    std::cout << "Accepted connection" << std::endl;
    m_ws.async_accept(boost::asio::bind_executor(
        strand, std::bind(&websocket_session::on_accept, , std::placeholders::_1)));
}

Это использует shared_from_this(), который будет пытатьсязаблокировать унифицированную weak_ptr от enable_shared_from_this.Как вы можете видеть в документации , которая вызывает исключение std::bad_weak_ptr (объявление 11)

Документация к shared_from_this явно предупреждает об этом:

Разрешается вызывать shared_from_this только для ранее совместно используемого объекта, то есть для объекта, управляемого std :: shared_ptr (в частности, , shared_from_this нельзя вызвать в конструкторе ).

...