提升async_write问题

时间:2011-02-14 15:41:15

标签: c++ boost boost-asio

我会展示一些代码;

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它运作良好,你能解释一下那里发生了什么,非常感谢......

1 个答案:

答案 0 :(得分:8)

您没有正确使用async_write。它是一个组合操作,由应用程序负责确保在调用写入处理程序之前不会对async_write上的pSerial进行任何其他调用。 documentation很好地总结了这个

  

此操作以术语实施   对流的零次或多次调用   async_write_some函数,是   称为组合操作。的的   程序必须确保流   不执行任何其他写操作   (例如async_write,流的   async_write_some函数,或任何   执行的其他组合操作   写道)直到这个操作   完成

我强调的是。要修复您的应用,您需要开始额外的async_write 您的wh()方法中的操作。您还需要调用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::shared_ptrasync_write传递给boost::bind处理程序的对象的成员来实现的。这个概念在asio例子中很普遍。