我使用boost asio和beast开发桌面聊天(用于浏览器支持)。
但是,在构建时,我遇到了一个问题: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在线调试器)
答案 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 )。