提升async_write问题

han*_*sen 4 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; 
} 
Run Code Online (Sandbox Code Playgroud)

当我使用该代码我得到内存泄漏时,我发现一些代码如minicom_client教程甚至从该代码复杂,我也在minicom_client上得到内存泄漏.如果我使用

    boost::asio::write(pSerial, boost::asio::buffer("A",1));
Run Code Online (Sandbox Code Playgroud)

而不是async_write它运作良好,你能解释那里发生了什么,非常感谢...

Sam*_*ler 8

你没有async_write正确使用.它是一个组合操作,由应用程序负责确保async_writepSerial调用写入处理程序之前不会对其进行任何其他调用.该文件总结了很好的

此操作是根据对流的async_write_some函数的零次或多次调用实现的,并且称为组合操作.程序必须确保流不执行任何其他写操作(例如async_write,流的async_write_some函数或执行写入的任何其他组合操作),直到此操作完成.

我强调的是.要修复您的应用程序,您需要async_writewh()方法中开始其他操作.您还需要调用io_service::run()启动异步事件循环.如果您不熟悉这个概念,我建议您在编写自己的代码之前研究这些示例.

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; 
} 
Run Code Online (Sandbox Code Playgroud)

由于在调用处理程序之前缓冲区将超出范围,所以写入代码也是值得注意的.通常,这是通过将缓冲区保留为将对象传递boost::shared_ptrasync_write处理程序的对象的成员来实现的boost::bind.这个概念在asio示例中很普遍.