最近在用QtNetwork编写服务器程序进行TCP/IP通信,大体过程如下:

1. 创建一个QTcpServer实例,监听目标IP和端口;

2. 一旦监听到有连接,获取和客户端之间的socket;

3. 使用socket进行通信;

4. 通信结束后,可以手动释放socket,也可以不管它,在释放QTcpServer的时候会把其下的所有socket全部自动释放。

在编写时,我做了如下事:

  1. TcpNetwork::TcpNetwork()
  2. {
  3. ...
  4. connect(mySocket, SIGNAL(disconnect(QTcpSocket*)), this, SLOT(ServerConnectionLost(QTcpSocket*)));
  5. ...
  6. }
  1. TcpNetwork::~TcpNetwork()
  2. {
  3. if (tcpServer != NULL)
  4. {
  5. delete tcpServer;
  6. }
  7. }
  1. <pre name="code" class="cpp">void TcpNetwork::ServerConnectionLost(QTcpSocket *socket)
  2. {
  3. if (socket == mySocket)
  4. {
  5. ...
  6. // debug
  7. delete mySocket;
  8. mySocket = NULL;
  9. ...
  10. }
  11. }

这样在关闭程序窗口时会导致崩溃,看了一下QTcpServer的析构函数源码后发现,在析构时Qt会首先检查QtcpServer下的socket指针所指向内存是否已被释放,然后执行每个socket的关闭操作,随后释放刚才被检查过的未被释放的socket内存,最后释放QTcpServer。

如果将QTcpSocket::disconnect()信号与一个其中带有释放socket操作的槽连接起来,那么如果socket还没有关闭就直接析构QTcpServer,在执行断开socket这一步时(如果之前已经断开了就不会再执行这一步了)会触发带有删除socket操作的槽,然而析构函数对此一无所知,紧接着便是析构函数来释放socket,也就造成了socket的内存的重复释放,导致崩溃。

解决方法:在关闭窗口之前先关闭socket,这样在析构函数中就不会再执行关闭socket的操作。或者在连接断开时触发的含有释放socket操作的槽中将delete socket改为socket->deleteLater()。

http://blog.csdn.net/qq_19672579/article/details/47973409

最新文章

  1. Dapper入门学习
  2. 【Java每日一题】20161107
  3. apache开源项目--mina
  4. 从零开始学android开发-Json转换利器Gson之实例
  5. Python之路【第二十四篇】:Python学习路径及练手项目合集
  6. 让C++控制台程序停下来,实现暂停功能
  7. C#/AutoCAD 2018/ObjectArx/二次开发添加图形对象步骤和添加直线的例子(三)
  8. 【ASP.NET Core快速入门】(十四)MVC开发:UI、 EF + Identity实现、注册实现、登陆实现
  9. APP偏移地址
  10. 【mybatis】之trim
  11. Linux系统磁盘与分区管理(7)
  12. git 在命令行与图形状态下使用详情
  13. Python:Selenium Chrome无弹窗+property/attribute/text
  14. Python Scrapy 自动爬虫注意细节(2)
  15. Oracle之SYSDBA的使用
  16. js实现点击按钮显示某个区域 然后点击页面中任意其他位置,隐藏该区域
  17. vue 开始开发
  18. kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数
  19. SqlServer 执行计划及Sql查询优化初探
  20. (转)jquery图片左右滚动

热门文章

  1. Global Git ignore - Stack Overflow
  2. 【27.22%】【poj2991】Crane
  3. MySQL中关于OR条件的优化
  4. hdfs的基本原理和基本操作总结
  5. 课堂随笔02--c#中string作为引用类型的特殊性
  6. 检索01-c#中基本数据类型和引用类型的区别
  7. 从张量积(tensor product)到多重线性代数(multilinear algebra)
  8. WPF入门(三)-&gt;两个几何图形合并(CombinedGeometry)
  9. 在CentOS系统上将deb包转换为rpm包
  10. VS版本 与 .NET版本以及C#版本之间的关系