Xaqq
Xaqq

Reputation: 4386

QTcpSocket and deletion

I'm writing a tcp based server using Qt.

I plan this server to be multithreaded, so my tcpserver class inherits from QTcpServer and overrides incomingConnection(). Everything is fine, except when it comes to deleting a user.

The TcpServer class manages a list of QSharedPointer<Client>. When I remove the said client from the list, it gets automatically deleted because of the smart pointer. My Client class owns a QSharedPointer<QTcpSocket> which means that the client's QTcpSocket gets deleted when the client is deleted.

Problem is, it seems that Qt tries to use this socket after its deletion, causing Segmentation Fault.

Should I manages a list for the sockets only, and call deleteLater() on them when I dont need them anymore? Or should I switch my socket's pointer in client class to a normal pointer?

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;

Upvotes: 2

Views: 4386

Answers (2)

alexisdm
alexisdm

Reputation: 29886

When you create your QSharedPointers you can pass a deleter to them, so that they'll use deleteLater instead of delete when you remove them from the list.

There is an example that does exactly that in the documentation too:
http://doc.trolltech.com/latest/qsharedpointer.html#QSharedPointer-3

Upvotes: 2

Michael Simpson
Michael Simpson

Reputation: 189

You need to use deleteLater on the Object. Incoming messages may come in after you delete the QTCPSocket. It is documented in Assistant. You can find an example here: qthelp://com.trolltech.qt.472/qdoc/qt4-network.html

M

Upvotes: 4

Related Questions