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它运作良好,你能解释那里发生了什么,非常感谢...
你没有async_write正确使用.它是一个组合操作,由应用程序负责确保async_write在pSerial调用写入处理程序之前不会对其进行任何其他调用.该文件总结了很好的
此操作是根据对流的async_write_some函数的零次或多次调用实现的,并且称为组合操作.程序必须确保流不执行任何其他写操作(例如async_write,流的async_write_some函数或执行写入的任何其他组合操作),直到此操作完成.
我强调的是.要修复您的应用程序,您需要async_write
从wh()方法中开始其他操作.您还需要调用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_ptr给async_write处理程序的对象的成员来实现的boost::bind.这个概念在asio示例中很普遍.
| 归档时间: |
|
| 查看次数: |
11152 次 |
| 最近记录: |