【问题标题】:QTcpSocket and deletionQTcpSocket与删除
【发布时间】:2015-10-23 00:25:13
【问题描述】:

我正在使用 Qt 编写基于 tcp 的服务器。

我计划这个服务器是多线程的, 所以我的 tcpserver 类继承自 QTcpServer 并覆盖 incomingConnection()。一切都很好,除了删除用户。

TcpServer 类管理 QSharedPointer<Client> 的列表。当我从列表中删除所述客户端时,由于智能指针,它会自动删除。 我的客户类拥有一个QSharedPointer<QTcpSocket>,这意味着客户的 QTcpSocket 在客户端被删除时被删除。

问题是,Qt 似乎在删除后尝试使用此套接字,导致分段错误。

我是否应该只管理套接字列表,并在不再需要它们时调用deleteLater()? 还是应该将客户端类中的套接字指针切换为普通指针?

void SlotSocketError(void)
{
  QTcpSocket sock = qobject_cast<QTcpSocket *>(QObject::sender());
  QSharedPointer<Client> client = GetClientFromSocket(sock);

  _clientList.removeAt(GetClientPositionInList(client));
}

 QList<QSharedPointer<Client> > _clientsList; // From TcpServer header.

 /* Client's class header */
 QSharedPointer<QTcpSocket> _socket;

【问题讨论】:

  • 你能显示一些代码吗?这比解释更有价值

标签: c++ qt tcp qsharedpointer


【解决方案1】:

您需要在对象上使用 deleteLater。删除 QTCPSocket 后,可能会收到传入消息。它记录在助手中。你可以在这里找到一个例子:qthelp://com.trolltech.qt.472/qdoc/qt4-network.html

M

【讨论】:

  • 感谢您的回答,我想我对此无能为力,可以吗?
  • 不,你不能。问题是套接字 first 中的错误处理代码发出错误信号,然后 then 继续访问自身,即取消引用“this”指针。如果删除插槽中的套接字,则在 tcpsocket 方法中访问“this”会崩溃。这就是为什么我们永远不应该在代码中直接或间接地删除由信号触发的 QObject。
【解决方案2】:

当您创建QSharedPointers 时,您可以将删除器传递给它们,这样当您从列表中删除它们时,它们将使用deleteLater 而不是delete

文档中也有一个例子:
http://doc.trolltech.com/latest/qsharedpointer.html#QSharedPointer-3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多