• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2014-04-17)  boost.asio 评论关闭  10 
    文章评分 0 次,平均分 0.0

    在类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定义成类的数据成员。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/3320.html

    关于
    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享