QTcpSocket和删除

时间:2011-09-20 14:20:54

标签: c++ qt tcp qsharedpointer

我正在使用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;

2 个答案:

答案 0 :(得分:4)

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

中号

答案 1 :(得分:2)

当您创建QSharedPointer时,您可以将删除操作传递给他们,这样当您从列表中删除时,他们将使用deleteLater代替delete

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