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