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