gpt4 book ai didi

c++ - QWebSocketServer - 不释放内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:27 28 4
gpt4 key购买 nike

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

其次,更重要,我观察到消耗的内存随着每个新连接而不断增加(即使旧连接已关闭并且它们的QWebSocket 实例被删除,实际上大多数时候有 0 或 1 个事件连接)在我的应用程序和 sslechoserver 演示中。我在 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

最佳答案

更新:我怀疑底层QTcpSocket 必须由用户管理。但是,从 Qt 5+ 开始似乎并非如此。请引用:Is the QTcpSocket (or QSslSocket) which underlies a QWebSocket -- destroyed by itself when a socket error happens? .
答案中不正确的部分在下面被划掉了。


当我们使用 QWebSocketServer::handleConnection() 方法将 QTcpSocket 升级为 QWebSocket 时,两个套接字在不同的内存地址上保持事件状态!

换句话说,QWebSocket 充当包装器,所有套接字通信都通过底层 QTcpSocket 进行。 因此,对于我们管理的每 1 个 Web 套接字,还有 1 个隐藏的 TCP 套接字。

两个套接字都应该使用 deleteLater()机制来处理,当它们打算被销毁时。
这种情况至少对于 TCP 到 Web 的升级是正确的。

关于c++ - QWebSocketServer - 不释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37296785/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com