shared_from_this verursacht bad_weak_ptr

Ich versuche zu halten, wird eine Liste der angeschlossenen clients in asio. Ich habe an die chat-server-Beispiel aus der Doku (http://www.boost.org/doc/libs/1_57_0/doc/html/boost_asio/example/cpp03/chat/chat_server.cpp) und hier ist der wichtige Teil von dem, was ich endete mit:

#include <iostream>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/asio.hpp>
#include <set>

using boost::asio::ip::tcp;

class tcp_connection;

std::set<boost::shared_ptr<tcp_connection>> clients;

void add_client(boost::shared_ptr<tcp_connection> client)
{
    clients.insert(client);
}

class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
{
public:
    tcp_connection(boost::asio::io_service& io_service) : socket_(io_service)
    {
    }

    tcp::socket socket_;

    void start()
    {
        add_client(shared_from_this());
    }

    tcp::socket& socket()
    {
        return socket_;
    }
};

class tcp_server
{
public:
    tcp_server(boost::asio::io_service& io_service)
        : io_service_(io_service),
        acceptor_(io_service, tcp::endpoint(tcp::v4(), 6767))
    {
        tcp_connection* new_connection = new tcp_connection(io_service_);
        acceptor_.async_accept(new_connection->socket(),
                             boost::bind(&tcp_server::start_accept, this, new_connection,
                                         boost::asio::placeholders::error));
    }

private:
    void start_accept(tcp_connection* new_connection,
                      const boost::system::error_code& error)
    {
        if (!error)
        {
            new_connection->start();
            new_connection = new tcp_connection(io_service_);
            acceptor_.async_accept(new_connection->socket(),
                                   boost::bind(&tcp_server::start_accept, this, new_connection,
                                               boost::asio::placeholders::error));
        }
    }

    boost::asio::io_service& io_service_;
    tcp::acceptor acceptor_;
};

int main()
{
    try
    {
        boost::asio::io_service io_service;
        tcp_server server(io_service);
        io_service.run();
    }
    catch (std::exception& e)
    {
        std::cerr << "Exception: " << e.what() << "\n";
    }

    return 0;
}

Beim Aufruf shared_from_this, mein server stürzt ab mit der Meldung "Exception: tr1::bad_weak_ptr." Ich habe getan, einige suchen, und es scheint shared_from_this() ziemlich allem, aber ich kann nicht scheinen, um herauszufinden, genau das, was ich ändern muss.

Kommentar zu dem Problem - Öffnen
Warum speichern Sie das Ergebnis von new in einem raw-pointer verwenden Sie nur shared_from_this() später? Es scheint Ihr design vereinfacht werden könnte um dieses problem zu beseitigen insgesamt. Kommentarautor: John Zwinck
Die boost-docs für enable_shared_from_this sagen Es muss vorhanden sein, mindestens eine shared_ptr-Instanz p besitzt t, die Sie scheinen nicht zu haben. Kommentarautor: Jonathan Potter
@JonathanPotter ich gelesen, aber ich verstehe es nicht. Kommentarautor: chrisvj
@chrisvj Meine interpretation ist, müssen Sie bereits eine shared_ptr, die das Objekt beinhaltet, bevor Sie mehr machen können mit shared_from_this. Es nie benutzt mich, aber so ist es nur eine Vermutung. Kommentarautor: Jonathan Potter
@JonathanPotter Hmm, nicht wissen, nicht sehen, nichts mit shared_ptr in dem Beispiel, das ich nicht habe. Kommentarautor: chrisvj

InformationsquelleAutor der Frage chrisvj | 2014-12-30

Schreibe einen Kommentar