我将展示一些代码;
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 它效果很好,你能解释一下那里发生了什么吗,非常感谢......
你没有使用async_write
正确。这是一个组合操作,应用程序有责任确保没有其他调用async_write
on pSerial
直到调用写处理程序为止。这文档 http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/reference/async_write/overload1.html很好地总结了这一点
此操作的实施方式为
对流的零次或多次调用
async_write_some 函数,并且是
称为组合操作。这
程序必须保证流
不执行其他写操作
(例如async_write,流的
async_write_some 函数,或任何
其他执行的组合操作
写入)直到此操作
完成。
强调是我加的。要修复您的应用程序,您需要启动额外的async_write
从您的内部进行操作wh()
方法。您还需要调用io_service::run()
to kick off http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/reference/io_service/run.html异步事件循环。如果你不熟悉这个概念,我建议你学习一下examples http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/examples.html在编写自己的代码之前。
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_ptr
to the async_write
处理程序通过boost::bind
。这个概念在 asio 示例中很普遍。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)