当我运行这段代码时,出现std :: bad_functon_call异常。 我无法弄清楚这个例外是什么原因。 它由receiveCallback中的async_receive引发。 在被调用之前receiveCallback是否从内存中清除出来?C++ lambda自传异常
//callback on connection accepted
std::function<void(const boost::system::error_code& error, tcp::socket* socketPtr)> acceptCallback =
[this, onMessageReceivedCallback, acceptCallback](const boost::system::error_code& error, tcp::socket* socketPtr)
{
cout<<"accept: "<<error.message()<<endl;
const int bufferSize = 100;
char* message = new char[bufferSize];
//callback on message received
std::function<void(const boost::system::error_code& error,std::size_t bytes_transferred)> receiveCallback =
[message, bufferSize, socketPtr, onMessageReceivedCallback, receiveCallback](const boost::system::error_code& error,std::size_t bytes_transferred)
{
onMessageReceivedCallback(message, bytes_transferred);
socketPtr->async_receive(
boost::asio::buffer(message, bufferSize),
receiveCallback);
};
socketPtr->async_receive(
boost::asio::buffer(message, bufferSize),
receiveCallback);
//create socket for the next connection
socketPtr = new tcp::socket(io_service_);
//continue accepting connections
acceptor_.async_accept(*socketPtr, std::bind(acceptCallback, std::placeholders::_1, socketPtr));
虽然lambda的可读性和排序可以很好,但由于生命周期,它往往很困难。作为替代方案,可能值得考虑[协程](http://stackoverflow.com/a/13997290/1053968)。 –