QTcpSocket и удаление - PullRequest
       58

QTcpSocket и удаление

2 голосов
/ 20 сентября 2011

Я пишу 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;

Ответы [ 2 ]

4 голосов
/ 20 сентября 2011

Вам необходимо использовать deleteLater для объекта.Входящие сообщения могут появиться после удаления QTCPSocket.Это задокументировано в Ассистенте.Вы можете найти пример здесь: qthelp: //com.trolltech.qt.472/qdoc/qt4-network.html

M

2 голосов
/ 25 сентября 2011

Когда вы создаете QSharedPointer s, вы можете передать им средство удаления, чтобы они использовали deleteLater вместо delete при удалении их из списка.

Существуетпример, который делает именно это в документации тоже:
http://doc.trolltech.com/latest/qsharedpointer.html#QSharedPointer-3

...