我会展示一些代码;
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它运作良好,你能解释一下那里发生了什么,非常感谢......
答案 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_ptr
将async_write
传递给boost::bind
处理程序的对象的成员来实现的。这个概念在asio例子中很普遍。