写了一个只从客户端读取数据的服务器:
使用boost :: array buffer
启动服务器和系统监视器显示1MB的使用情况。
1。)只需执行async_read_some并执行handleRead,我再次调用asyncRead函数。
void asyncRead() {
m_socket->async_read_some(
boost::asio::buffer(m_readBuffer, READ_BLOCK_SIZE),
m_strand->wrap(boost::bind(&ConnectionHandler::handleRead,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred))
);
}
并且在handleRead中我验证是否有任何错误,如果没有,我只是发出另一个asyncRead()。
2。)保持发送帧(大小约为102字节的数据)。
10000帧的测试结束。总发送大小= 102 * 10000 总读取大小= 102 * 10000
但是,系统监视器中的内存使用量高达7.8 Mb。
无法弄清楚这种增加的原因。尝试的不同方面是: 1.)正在建立的连接数 - 仅1。 2.)已确认关闭连接 - 是的。 3.)甚至停止了ioServic,但仍然没有变化。
在客户端的第二次运行中,我看到内存在增加。可能是这样的?我使用的是boost :: array,这是一个堆栈变量,只是阅读。没有其他地方有一个缓冲区被初始化。
答案 0 :(得分:0)
拉加,
首先,您是否知道async_read_some不保证您将读取整个READ_BLOCK_SIZE?如果您需要这种保证,我建议您改为使用async_read。
现在,回到最初的问题,你的情况非常典型。所以,基本上,你需要一个容器(数组)来保存数据直到发送,然后你需要摆脱它。
我强烈建议您切换到提升shared_array。您可以像使用boost数组一样使用它,但它有一个内置的引用计数器,因此当不再需要该对象时将删除该对象。这应该可以解决你的内存泄漏问题。