簡體   English   中英

bad_weak_ptr,同時使用從boost :: asio :: io_context :: service繼承的類

[英]bad_weak_ptr while using class inheriting from boost::asio::io_context::service

我開始練習使用boost asio和boost beast開發我自己的基本服務器和連接類。 最近,我遇到了bad_weak_ptr異常,無法弄清楚如何解決該問題。 這是代碼:

class server : public boost::asio::io_context::service
    {
        tcp::endpoint endpoint{ boost::asio::ip::address_v6::any(), 7654 };
        tcp::acceptor acceptor;
        boost::asio::strand<boost::asio::io_context::executor_type> strand;
        std::vector<std::weak_ptr<tcp_connection_ui>> connections;
    public:
        static const boost::asio::execution_context::id id;

        explicit tcp_server_ui(boost::asio::io_context& ioc)
            : boost::asio::io_context::service{ ioc }
            , acceptor{ ioc, endpoint }
            , strand{ ioc.get_executor() }
        {
        }

        void run()
        {
            boost::asio::post(strand, [this] {start_accept(); });
        }

        void start_accept()
        {
            tcp::socket socket{ acceptor.get_io_context() };
            tcp_connection_ui::pointer new_connection =
                tcp_connection_ui::create(std::move(socket));

            connections.push_back(new_connection);

            acceptor.async_accept(new_connection->web_socket().next_layer(),
                boost::asio::bind_executor(strand, std::bind(
                    &tcp_server_ui::handle_accept,
                    this, new_connection, std::placeholders::_1)));
        }

        void handle_accept(tcp_connection_ui::pointer new_connection,
            boost::system::error_code ec)
        {
            if (!ec) {
                new_connection->run();
            }

            start_accept();
        }

        void broadcast(std::string&& msg)
        {
            std::cout << '+' << std::endl;
            if (connections.empty())
                return;

            for (auto const & x : connections)
                x.lock()->enqueue_message(std::move(msg));
        }
    };

還有代碼停止運行的地方:

class tcp_connection_ui : std::enable_shared_from_this<tcp_connection_ui>
    {
    public:
        using pointer = std::shared_ptr<tcp_connection_ui>;

        static pointer create(tcp::socket socket)
        {
            return std::make_shared<tcp_connection_ui>(tcp_connection_ui{ std::move(socket) });
        }

        void run()
        {
            ws.async_accept(boost::asio::bind_executor(strand, std::bind(
                &tcp_connection_ui::on_accept, shared_from_this(),
                std::placeholders::_1)));
        } .../};

如果客戶端嘗試連接server :: handle_accept中的shared_from_this值,則等於_Wptr =空。 我認為我在理解io_context :: service和/或shared_from_this功能時遇到了一些麻煩。 任何幫助,將不勝感激。

基類必須公開繼承:

class tcp_connection_ui : public std::enable_shared_from_this<tcp_connection_ui>

否則, make_sharedshared_ptr將不會注意到它,並隨后無法初始化“隱藏”的weak_ptr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM