如何安全删除QT::QTcpSocket
How to safely delete a QT::QTcpSocket?
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
。
- 如何使用Qt删除单词中的表行
- QT C++删除带有 *(名称包含)的文件
- Qt创建者-如何删除Clang代码模型
- 试图打开并读取一个.txt文件,但它从原始文件中删除了实际文本(Qt GUI C++
- 如何删除Qt设计器中自定义插件的QString属性的"translatable"复选框?
- Qt(QVBoxLayout类)中的小部件何时删除?
- 为什么我无法在Qt Designer中删除tabWidget?
- Qt:从QAbstractListModel中删除多行
- 如何在Qt中删除字符串(qstring)中的子字符串
- Qt如何删除QObjects?
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 在QT中,接收到子小部件产生的信号后,如何从父小部件中删除子小部件?
- QT中删除按钮
- 如何安全删除QT::QTcpSocket
- 为什么删除Qt(QSslSocket)对象会导致崩溃
- 删除Qt中树的项目
- 如何删除Qt窗口的所有子窗口
- 在单独的线程上删除qt类后ASSERT失败
- 如何删除Qt中QTableView的行号
- 永久删除Qt中的文件