Я пишу tcp-сервер, используя Qt.
Я планирую, чтобы этот сервер был многопоточным,
поэтому мой класс 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;