2011-02-14 64 views
3

我会显示一段代码;提升async_write问题

void wh(const boost::system::error_code& ec, 
     std::size_t bytes_transferred) 
{ 
    std::cout << "test"; 
} 

int main(int argc, char* argv[]) 
{ 
    boost::asio::io_service pService; 
    boost::asio::serial_port pSerial(pService,"COM4"); 

    while (true) { 
     boost::asio::async_write(pSerial, boost::asio::buffer("A",1),&wh); 
    } 

    return 0; 
} 

当我使用的代码我得到的内存泄漏,我发现了一些片段,例如minicom_client教程从代码还我对minicom_client让内存泄漏,甚至复杂的代码。如果我使用

boost::asio::write(pSerial, boost::asio::buffer("A",1)); 

,而不是ASYNC_WRITE的效果很好,你能解释一下这是怎么回事那里,非常感谢......

+0

您使用的是什么版本的boost? – Flexo 2011-02-14 15:44:40

回答

7

你没有正确使用async_write。这是一个组合操作,应用程序有责任确保在pSerial之前不会调用async_write,直到调用写入处理程序为止。该documentation总结了很好的

此操作零个或多个电话 条款落实到流的 async_write_some功能,并且是 称为一个组合操作。 该 程序必须确保流 不进行任何其它的写入操作 (如ASYNC_WRITE,该流的 async_write_some功能,或者执行 写入任何其他 组成操作),直到该操作 完成。

强调加我的。要修复您的应用程序,您需要从wh()方法中启动额外的async_write 操作。您还需要调用io_service::run()kick off异步事件循环。如果您对这个概念不熟悉,我建议您在编写自己的代码之前先学习examples

int main(int argc, char* argv[]) 
{ 
    boost::asio::io_service pService; 
    boost::asio::serial_port pSerial(pService,"COM4"); 

    boost::asio::async_write(
     pSerial, 
     boost::asio::buffer("A",1), 
     boost::bind(
      &wh, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred 
     ); 

    pService.run(); 

    return 0; 
} 

还值得注意的是,由于写入的代码是危险的,因为缓冲区在调用处理程序之前会超出范围。通常这是通过将缓冲区保留为通过boost::bind传递boost::shared_ptrasync_write处理程序的对象的成员来完成的。这个概念在asio的例子中很流行。

+0

@hansen我已经添加了一个例子。 – 2011-02-15 14:42:35