2

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;
4

2 に答える 2

4

オブジェクトでdeleteLaterを使用する必要があります。QTCPSocketを削除すると、着信メッセージが届く場合があります。アシスタントに記載されています。ここに例があります:qthelp://com.trolltech.qt.472/qdoc/qt4-network.html

M

于 2011-09-20T14:52:37.830 に答える
2

を作成するときにQSharedPointer、削除機能を渡すことができます。これにより、リストから削除するときdeleteLaterの代わりに、削除機能が使用されます。delete

ドキュメントにもそれを正確に行う例があります:http:
//doc.trolltech.com/latest/qsharedpointer.html#QSharedPointer-3

于 2011-09-25T14:08:45.980 に答える