在deleteLater之后,我可以再次使用QTcpSocket进行另一个连接吗?

Can i use QTcpSocket again for another connection after deleteLater?

本文关键字:QTcpSocket 另一个 连接 之后 deleteLater 我可以      更新时间:2023-10-16

我尝试使用QTcpSserver,它将保持与一个且一次只有一个客户端的连接,直到客户端断开连接。因此,我在类中保留了带有成员指针的客户机。

问题出现在这里:在我在网上看到的例子中,在disconnected()之后,它被称为deleteLater()。很好,但我将在另一个连接中再次使用这个类成员指针。请记住,服务器一次只保留一个客户端。那么,如果套接字对象在其上分配了另一个连接后被删除怎么办?

我的意思是:

class TcpServer(QObject* o) : public QTcpServer {
...
private:
    QTcpSocket* client;
}
void TcpServer::connected() {
    client = this->nextPendingConnection();
    this->pauseAccepting();
    connect(client, SIGNAL(disconnected()), client, SLOT(clientDisconnected()));
}
void TcpServer::clientDisconnected() {
    client->deleteLater();
    this->resumeAccepting();
}

场景如下:

  1. 客户端连接。因此,client = nextPendingConnection();

  2. 服务器暂停侦听。不接受新连接

  3. 客户端未连接。需要释放client。因此,client->deleteLater()被称为

  4. 新连接到来。输入client = nextPendingConnection();

但是,之前的client对象被删除了吗?也许?也许不是吗?如果事件循环试图删除client,在我在步骤5中为它分配了新的连接之后,该怎么办?

那么,我如何保留一个且只有一个客户端,同时删除以前未连接的客户端?

如果我这样做安全吗?

void TcpServer::clientDisconnected()
{
    QSocket* ptr = client;
    ptr->deleteLater();
    ...
}

我将引用Qt文档:

当控制返回到事件循环时,对象将被删除。

所以deleteLater()是延迟的delete。一旦调用deleteLater(),该对象将被视为已删除。

您的nextPendingConnection()调用将创建另一个需要稍后删除的对象。

然而,在你的情况下,你只允许一个挂起连接,直到客户端被断开连接。在这种情况下,它应该是安全的,在其他情况下,你可以覆盖你的客户端指针,将失去对它的控制(内存泄漏)。

即使在你的情况下,我也更喜欢这样的解决方案:

void TcpServer::clientDisconnected()
{
    if (qobject_cast<QAbstractSocket*>(sender())) {
        sender()->deleteLater();
    }
    ...
}

如果在将来更改应用程序时允许多个连接,这也是安全的。

据我所知,nextPendingConnection();将返回指向新的QTcpSocket类对象的指针,因此您无需担心。

deleteLater()将只计划删除您的旧对象。QTcpSocket* client只包含指向QTcpSocket类对象的指针。当你调用deleteLater()时,Qt将只删除client在调用该函数时所指向的对象。

相关文章: