QWebSocketServer - 不释放内存

时间:2016-05-18 10:23:23

标签: c++ qt memory-leaks websocket

首先,我在我的安全websocket服务器应用程序上运行valgrind并发现了一个问题(在Qt Memcheck中我必须检查“外部错误”才能看到它) - 某些字节肯定会丢失 - 指向main我的QCoreApplication::exec()电话所在的libQt5Core。在堆栈跟踪中,在调用之后,只有一些Qt库,从libQt5WebSockets开始,以QWebSocket结尾。丢失的字节数随着连接数的增加而增加。我仔细检查了我删除了QWebSocketServer::nextPendingConnection()返回的所有QWebSocketServer个实例。我也删除QWebSocket实例。有趣的是,valgrind在运行 sslechoserver demo时也没有报告任何错误,也没有在不安全模式下运行我的服务器(没有SSL)。我不知道这是否是一个实际问题。

其次,更重要的是,我观察到消耗的内存随着每个新连接而不断增加(即使旧连接已关闭且其${flavour}Compile个实例在我的应用程序和 sslechoserver 演示中删除,实际上大部分时间都有0或1个活动连接。我在Ubuntu上使用 systemmonitor ,在Windows上使用 Windows任务管理器进行观察。在建立了数万个连接后,报告的内存使用量为几十兆字节,而在应用程序生命周期的开始时,它大约为1.5 MB。

我使用Qt 5.5.1和5.6.0(Ubuntu上的GCC,Windows上的MSVC)进行了测试。

我出错了吗? Qt的websockets中有错误吗? sslechoserver 演示是否不正确?

更新我还尝试了 echoserver 演示(没有SSL),消耗的内存也在不断增加。

更新2:我们认为Qt中肯定存在错误。错误报告在这里: https://bugreports.qt.io/browse/QTBUG-53503

1 个答案:

答案 0 :(得分:0)

当我们使用express方法将QTcpSocket升级到QWebSocket时,两个套接字都在不同的内存地址上保持活动状态!

换句话说,QWebSocketServer::handleConnection()充当包装器,并且所有套接字通信都通过基础的QWebSocket进行。 因此,我们管理的每个1个Web套接字中,还有1个隐藏的TCP套接字。

两个套接字在要销毁时都应使用QTcpSocket机制处理。
这种情况至少对于从TCP到Web的升级都是正确的。