在deleteLater之后,我可以再次使用QTcpSocket进行另一个连接吗?
Can i use QTcpSocket again for another connection after deleteLater?
我尝试使用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();
}
场景如下:
客户端连接。因此,
client = nextPendingConnection();
服务器暂停侦听。不接受新连接
客户端未连接。需要释放
client
。因此,client->deleteLater()
被称为新连接到来。输入
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
在调用该函数时所指向的对象。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- QTcpSocket:消息不是从另一个线程发送的
- 在deleteLater之后,我可以再次使用QTcpSocket进行另一个连接吗?
- 从另一个线程关闭QTcpSocket