具有boost智能指针的bad_weak_ptr

时间:2018-12-15 17:25:37

标签: c++ networking boost-asio boost-beast

我使用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连接到服务器 如果我从chat_websoket_session类中将其调用到wait_for_data中,则会遇到问题。 所以我必须找到如何调用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 ));

引用至boost beast websocket example,我首先接受套接字,然后接受m_ws.async_accept()接受websocket,但是现在有了Bad file descriptor,这意味着套接字未打开。

P.S:我更新了ide URL(GDB在线调试器)

1 个答案:

答案 0 :(得分:3)

您正在使用构造函数内部的共享指针:

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。如您所见,在documentation中引发了std::bad_weak_ptr异常(广告11)

shared_from_this的文档对此进行了明确警告:

  

只允许在以前共享的对象上调用shared_from_this,即在std :: shared_ptr管理的对象上(特别是 ,在构造函数中不能调用shared_from_this )。