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;