首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QTcpSocket和删除

QTcpSocket和删除
EN

Stack Overflow用户
提问于 2011-09-20 22:20:54
回答 2查看 4K关注 0票数 2

我正在使用Qt编写一个基于tcp的服务器。

我计划这个服务器是多线程的,所以我的tcpserver类继承自QTcpServer并覆盖incomingConnection()。一切都很好,除了删除用户的时候。

TcpServer类管理一个QSharedPointer<Client>列表。当我从列表中删除上述客户端时,它会因为智能指针而自动删除。我的Client类拥有一个QSharedPointer<QTcpSocket>,这意味着当客户端被删除时,客户端的QTcpSocket将被删除。

问题是,Qt似乎在删除套接字后尝试使用该套接字,从而导致分段错误。

我是否应该只管理套接字的列表,并在不再需要套接字时调用deleteLater()?或者我应该将客户端类中套接字的指针切换为普通指针?

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-20 22:52:38

您需要在对象上使用deleteLater。删除QTCPSocket后,可能会收到传入的消息。它在Assistant中有说明。你可以在这里找到一个例子: qthelp://com.trolltech.qt.472/qdoc/qt4-network.html

票数 4
EN

Stack Overflow用户

发布于 2011-09-25 22:08:46

当您创建QSharedPointers时,您可以向它们传递一个deleter,这样当您从列表中删除它们时,它们将使用deleteLater而不是delete

文档中也有一个示例可以做到这一点:

http://doc.trolltech.com/latest/qsharedpointer.html#QSharedPointer-3

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7486721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档