异步时使用局部变量注意点

2014年4月17日 由 Creater 留言 »

在类udp_server中,有下面一段异步接收数据的代码。

		socket_.async_receive_from(
			boost::asio::buffer(recv_buffer_), remote_endpoint_,
			boost::bind(&udp_server::handle_receive, this,
			boost::asio::placeholders::error));

在处理函数handle_receive中,需要将当前的日期字符串发给客户端,异步编程一般都需要使用bind来实现回调,以下为正确的代码:

	void handle_receive(const boost::system::error_code& error)
	{
		if (!error || error == boost::asio::error::message_size)
		{
			boost::shared_ptr<std::string> message(
				new std::string(make_daytime_string()));
			socket_.async_send_to(boost::asio::buffer(*message), remote_endpoint_,
				boost::bind(&udp_server::handle_send, this, message));
			start_receive();
		}
	}

但是往往在非异步编程中,我们对message的处理并不会用智能指针来包裹,而是在栈上定义一个临时变量,比如

	void handle_receive(const boost::system::error_code& error)
	{
		if (!error || error == boost::asio::error::message_size)
		{
			std::string message = make_daytime_string();
			socket_.async_send_to(boost::asio::buffer(message), remote_endpoint_,
				boost::bind(&udp_server::handle_send, this, message));
			start_receive();
		}
	}

在handle_receive函数结构后,栈上的对象message就会被析构,但是异步asyc_仍旧在使用它,所以会出错。

我们可以有几种解决办法:

1.使用文章头部的代码,用智能指针。

2.将message定义成类的数据成员。

广告位

评论已关闭.