我正在使用Qt编写一个基于tcp的服务器。
我计划这个服务器是多线程的,所以我的tcpserver类继承自QTcpServer并覆盖incomingConnection()。一切都很好,除了删除用户的时候。
TcpServer类管理一个QSharedPointer<Client>列表。当我从列表中删除上述客户端时,它会因为智能指针而自动删除。我的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;发布于 2011-09-20 22:52:38
您需要在对象上使用deleteLater。删除QTCPSocket后,可能会收到传入的消息。它在Assistant中有说明。你可以在这里找到一个例子: qthelp://com.trolltech.qt.472/qdoc/qt4-network.html
我
发布于 2011-09-25 22:08:46
当您创建QSharedPointers时,您可以向它们传递一个deleter,这样当您从列表中删除它们时,它们将使用deleteLater而不是delete。
文档中也有一个示例可以做到这一点:
http://doc.trolltech.com/latest/qsharedpointer.html#QSharedPointer-3
https://stackoverflow.com/questions/7486721
复制相似问题