如何安全删除QT::QTcpSocket

How to safely delete a QT::QTcpSocket?

本文关键字:删除 QT QTcpSocket 安全 何安全      更新时间:2023-10-16

QTcpSocket*QTcpServer::nextPendingConnection()[virtual]

套接字是作为服务器的子级创建的,这意味着它当QTcpServer对象被销毁时自动删除。是的完成后显式删除对象仍然是个好主意使用它,以避免浪费内存。

在我的应用程序中,QTcpServer的寿命很长(当连接关闭时,它会与主机断开连接,但除非程序退出,否则永远不会被破坏),它接受了大量的QTcpServer::nextPendingConnection并占用了大量内存。

在切换到下一个挂起的QTcpSocket对象之前,我应该如何删除旧的QTcpSocket对象以节省内存,同时避免双重删除?

delete在这种情况下可以吗?

在这种情况下可以删除吗?

是的,这要归功于Qt对象设计的巧妙。

特别是,QTcpSocket(最终)从Object派生,QObject析构函数方法在末尾包含以下代码:

if (d->parent)        // remove it from parent object
    d->setParent_helper(0);

因此,删除QTcpSocket对象将自动从其父对象(在本例中为QTcpServer)的子对象列表中删除QTcpSocket,因此当QTcpServer对象被销毁时,将不会进行双重删除。

在任何非平凡的代码中,您应该在QTcpSocket上调用deleteLater,而不是直接调用delete。最终结果将是相同的(除了在事件循环已经停止的退化情况下),但它将保证在删除时堆栈已经展开回事件循环。这将为您节省大量神经组织。

原因是,在设计中,某个QTcpServer/QTcpSocket总是在单个线程内使用(不一定是主线程,也不一定是GUI线程,而是单个线程),在这种情况下,连接到其信号的任何插槽都将被直接称为,无论信号在其肠道深处发出。一般来说,当你从连接到它的信号的插槽返回时,你不知道Qt类会做什么,而控制又回到了它的内脏。它很可能会尝试取消引用您刚刚删除的QTcpSocket,Jeremy提到的automagic也无济于事。

另一种选择是在连接到这样的信号时始终明确指定Qt::QueuedConnection