Boost async_write problem

妖精的绣舞 提交于 2019-12-22 08:55:15

问题


i'll show some piece of code ;

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; 
} 

when i use that code i'm getting memory leak, I found some piece of code like minicom_client tutorial even complex from that code also i'm getting memory leak on minicom_client. If i use

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

instead of async_write it works well, Could you explain what's going on there , Thanks a lot ...


回答1:


You're not using async_write correctly. It is a composed operation, and it's up to the application's responsibility to ensure no other calls to async_write on pSerial are made until the write handler is invoked. The documentation summarizes this nicely

This operation is implemented in terms of zero or more calls to the stream's async_write_some function, and is known as a composed operation. The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes.

emphasis added by me. To fix your application, you'll need to start additional async_write operations from within your wh() method. You'll also need to invoke io_service::run() to kick off the asynchronous event loop. If this concept is unfamiliar to you, I suggest studying the examples prior to writing your own code.

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; 
} 

It's also worth noting your code as written is dangerous since the buffer will go out of scope before the handler is invoked. Typically this is accomplished by retaining the buffer as a member of an object that passes a boost::shared_ptr to the async_write handler via boost::bind. This concept is prevalent in the asio examples.



来源:https://stackoverflow.com/questions/4994077/boost-async-write-problem

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!