C++ 常量引用传递的回调函数调用错误

C++ 常量引用传递的回调函数调用错误,c++,lambda,callback,boost-asio,C++,Lambda,Callback,Boost Asio,我目前正在终止代码中的“坏函数调用”错误,我无法解决该错误。显然,当调用TcpConnection::start()方法时,我通过const引用传递给TcpConnection的回调为null/不再有效 为了简单起见,我在下面发布了一个简化的示例,其中不包含完整的代码。如果这还不足以追踪问题,我可以编辑我的问题并发布其余的代码 我不是C++专家,所以对我耐心点: 但是,当新连接到达时,错误发生在TcpConnection::start()上,onDataReceived回调不知何故没有(或有一个

我目前正在终止代码中的“坏函数调用”错误,我无法解决该错误。显然,当调用TcpConnection::start()方法时,我通过const引用传递给TcpConnection的回调为null/不再有效

为了简单起见,我在下面发布了一个简化的示例,其中不包含完整的代码。如果这还不足以追踪问题,我可以编辑我的问题并发布其余的代码

<>我不是C++专家,所以对我耐心点:

但是,当新连接到达时,错误发生在TcpConnection::start()上,onDataReceived回调不知何故没有(或有一个已删除的?)函数引用。当我通过值传递回调时,它会工作


这可能是什么原因?我该如何解决它?

1)“当我通过值传递回调时,它会工作。”“我该如何解决它?”这里的答案似乎很明显。2) 你知道通过引用传递变量和通过值传递变量之间的区别吗?我不确定这是否是解决这个问题的最佳方法。因为按值传递它会导致不必要的内存拷贝,我猜?没有办法用引用来解决它吗?你知道包含值的变量和引用之间的区别吗?对引用施加额外的要求,以便在不调用未定义行为的情况下使用它们?相关阅读:
typedef std::function<void()> TcpMessageCallback;

class TcpConnection : public std::enable_shared_from_this<TcpConnection> {
public:
    typedef std::shared_ptr<TcpConnection> pointer;

    static pointer create(boost::asio::io_context &io_context, const TcpMessageCallback &cb) {
        return pointer(new TcpConnection(io_context, cb));
    }

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

    void start() {
        onDataCallback(); // <---- ***Error happens here***
    }

private:
    TcpConnection(boost::asio::io_context &io_context, const TcpMessageCallback &cb)
    : socket_(io_context), onDataCallback(cb){};

    tcp::socket socket_;
    const TcpMessageCallback &onDataCallback;
};

class TcpServer {
public:
    explicit TcpServer(boost::asio::io_context &context, const TcpMessageCallback &cb) :
            io_context(context),
            acceptor(context, tcp::endpoint(tcp::v4(), TCP_PORT_NUMBER)),
            onDataReceivedCb(cb) {
        start_accept();
    }

private:
    void start_accept() {
        tcpConnection = TcpConnection::create(io_context, onDataReceivedCb);

        auto onAcceptCb = [objPtr = this](auto error) {
                    objPtr->handle_accept(error);
                };
        acceptor.async_accept(tcpConnection->socket(), onAcceptCb);
    }

    void handle_accept(const boost::system::error_code &error) {
        if (!acceptor.is_open())
        {
            return;
        }

        if (!error) {
            tcpConnection->start();
        }
        start_accept();
    }

    boost::asio::io_context &io_context;
    tcp::acceptor acceptor;
    TcpConnection::pointer tcpConnection;
    const TcpMessageCallback &onDataReceivedCb;
};
//... define context
auto server = TcpServer(io_context, []{ /*...*/});
io_context.run()