gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:49:21 41 4
gpt4 key购买 nike

我尝试使用 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. 服务器继续监听。

  5. 新连接来了。所以,我需要 client = nextPendingConnection();

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

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

如果我这样做会安全吗?

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

最佳答案

我将引用有关它的 Qt 文档:

The object will be deleted when control returns to the event loop.

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

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

但是在您的情况下,您只允许一个挂起的连接,并且在客户端断开连接之前不允许接受。在这种情况下,它应该是安全的,在其他情况下,您可能会覆盖您的客户端指针并失去对它的控制(内存泄漏)。

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

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

如果在您的应用程序的 future 更改中允许多个连接,这也是安全的。

关于c++ - 我可以在 deleteLater 之后再次使用 QTcpSocket 进行另一个连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32601867/

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