Qt QTcpSocket工作线程持续写入避免内存泄漏的最佳实践咨询
问题解答
1. 每次循环迭代都创建新的QTcpSocket是否是正确的做法?
不是,这正是你程序内存泄漏的核心原因:
- 你每次循环都
new QTcpSocket(this),父对象是Task_SendPacket实例,虽然绑定了disconnected信号触发deleteLater,但你的startTask是死循环逻辑,全程占用子线程的执行资源,线程的事件循环根本没有空闲时机派发deleteLater的销毁事件,所有创建的QTcpSocket实例都不会被自动释放,内存占用会随运行时间持续上涨。 - 如果没有单次通信的链路隔离要求,完全可以复用同一个QTcpSocket实例,你第二个版本把socket创建移到循环外的实现逻辑更合理,既降低了反复创建销毁对象的开销,也避免了频繁申请内存带来的泄漏风险。
2. 已经监听到socket触发了disconnect信号,为什么该socket仍然可以正常工作?
disconnected信号仅代表当前TCP连接已断开,不代表QTcpSocket对象本身被销毁:
- 你绑定的
disconnected->deleteLater逻辑没有执行,原因同上,死循环阻塞了事件循环,socket对象一直存活在内存中。 - QTcpSocket本身是支持复用的,只要对象未被销毁,即使连接断开,再次调用
connectToHost就可以建立新的TCP连接,完全可以正常工作。
额外优化建议
你的现有实现用死循环+阻塞waitFor系列函数+线程sleep的逻辑不合理,建议改用QTimer定时触发发送逻辑,让出线程事件循环的执行权,所有信号槽、延迟销毁逻辑才能正常触发,也能避免不必要的线程阻塞。
内容的提问来源于stack exchange,提问作者Kite
相关产品推荐
相关产品推荐

