QT中C端关闭导致S端崩溃问题

在实现多线程C/S通信时,有一个bug卡了我好久——当有一个C端关闭时,S端会崩溃。

经过一条条函数语句的筛查,终于找到问题出在哪里:

我通过类QList和迭代器来存储、访问C端链接的socket,而我在deleteSocket中delete迭代器后还想要访问到它,导致了内存的异常访问,使程序崩溃了。所以把delete *iter改成(*iter)->deleteLater(); 既可以实现原来释放内存的作用,又不会使程序崩溃

void MyTcpServer::deleteSocket(MyTcpSocket *mysocket)
{

    QList<MyTcpSocket*>::Iterator iter=m_tcpSocketList.begin();
   // qDebug()<<"deleteSocket触发";
    for(;iter!=m_tcpSocketList.end();iter++)
    {
       // qDebug()<<"deleteSocket进入循环";
        if(*iter==mysocket)
         //删除list容器中的节点以及socket
        {
            //原先写的 delete *iter,导致程序一直崩溃
            (*iter)->deleteLater();//延迟释放空间,否则会导致崩溃
            *iter=NULL;
             qDebug()<<"成功deleteSocket";
            m_tcpSocketList.erase(iter);
              qDebug()<<"成功erase";
            break;
        }
    }

    for(int i=0;i<m_tcpSocketList.size();i++)
    {
       // qDebug()<<m_tcpSocketList.at(i)->getName();
    }
}

 附上在寻找BUG中GPT给出的C端关闭可能导致S端崩溃的原因        (尽管没什么鸟用)  

在QT中,如果客户端(C端)关闭后服务器端(S端)崩溃,可能是由于以下几个原因:

1. **未处理的异常**:程序中可能存在未被正确捕获和处理的异常。在程序的主循环或关键部分添加异常处理代码,确保所有异常都被正确处理,可以避免程序在关闭时崩溃。
2. **资源释放不当**:确保在程序中使用的资源(如文件、内存等)在不再使用时得到正确的释放。使用RAII(Resource Acquisition Is Initialization)技术可以帮助自动管理资源的释放,确保程序的正常关闭。
3. **线程退出逻辑问题**:在关闭程序时,需要确保所有线程都已经正确退出并释放了资源。可以使用线程同步机制(如互斥锁、条件变量等)来协调线程的退出。
4. **Qt版本bug**:有时候,Qt版本可能存在一些已知的bug,导致程序在关闭时崩溃。尝试更新到最新的Qt版本,看是否能解决问题。
5. **socket操作问题**:如果在客户端关闭连接时,服务器端的QTcpServer对象被析构,而此时socket还没有正确关闭,可能会导致崩溃。确保在断开socket之前,socket已经被正确关闭。
6. **内存泄漏**:如果程序中存在内存泄漏,可能会导致系统资源耗尽,从而引起崩溃。检查程序是否存在内存泄漏,并修复相关问题。
7. **TCP连接关闭方式**:了解不同的TCP连接关闭方式,并选择适当的关闭方法。例如,调用close()方法来关闭socket,而不是依赖于进程的正常结束来关闭连接。
8. **网络编程错误**:检查网络编程的逻辑,确保没有错误的读写操作或者错误的信号槽连接。例如,确保在使用write()方法后,调用flush()方法来确保数据被发送出去。

综上所述,为了解决QT中C端关闭后S端崩溃的问题,您可能需要从异常处理、资源管理、多线程退出、Qt版本更新、socket操作、内存管理以及网络编程逻辑等多个方面进行排查和调试。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【农业期刊】转基因作物的利弊分析

摘要概述1 转基因作物的优越性1.1 被修饰生物体的基因的遗传具有稳定性1.2 减少除草剂和农药用量1.3 资源可再生&#xff0c;符合可持续发展观念1.4 改生存环境、增产增收解决人类温饱问题 2 转基因作物的带来的不利影响2.1 影响农业种植制度2.2 转基因技术带来的基因污染2.2.1…

【爬虫之scrapy框架——尚硅谷(学习笔记two)--爬取电影天堂(基本步骤)】

爬虫之scrapy框架--爬取电影天堂——解释多页爬取函数编写逻辑 &#xff08;1&#xff09;爬虫文件创建&#xff08;2&#xff09;检查网址是否正确&#xff08;3&#xff09;检查反爬&#xff08;3.1&#xff09; 简写输出语句&#xff0c;检查是否反爬&#xff08;3.2&#x…

Codeforces Round 920 (Div. 3) D. Very Different Array (贪心)

Petya 有一个由 n n n 个整数组成的数组 a i a_i ai​ 。他的弟弟 Vasya 很羡慕&#xff0c;决定自己也做一个 n n n 个整数的数组。 为此&#xff0c;他找到了 m m m 个整数 b i ( m ≥ n ) b_i ( m≥n ) bi​(m≥n)&#xff0c;现在他想从中选择一些 n n n 个整数并按…

电力系统潮流计算的计算机算法(一)——网络方程、功率方程和节点分类

本篇为本科课程《电力系统稳态分析》的笔记。 本篇为这一章的第一篇笔记。下一篇传送门。 实际中的大规模电力系统包含成百上千个节点、发电机组和负荷&#xff0c;网络是复杂的&#xff0c;需要建立复杂电力系统的同一潮流数学模型&#xff0c;借助计算机进行求解。 简介 …

免费Premiere模板,几何图形元素动画视频幻灯片模板素材下载

Premiere Pro模板&#xff0c;几何图形元素动画视频幻灯片模板 &#xff0c;组织良好&#xff0c;易于自定义。包括PDF教程。 项目特点&#xff1a; 使用Adobe Premiere Pro 2021及以上版本。 19201080全高清。 不需要插件。 包括帮助视频。 免费下载&#xff1a;https://prmu…

Fabric实现多GPU运行

官方的将pytorch转换为fabric简单分为五个步骤&#xff1a; 步骤 1&#xff1a; 在训练代码的开头创建 Fabric 对象 from lightning.fabric import Fabricfabric Fabric() 步骤 2&#xff1a; 如果打算使用多个设备&#xff08;例如多 GPU&#xff09;&#xff0c;就调用…

NIO使用NIO传输图片

相比于传统的阻塞IO&#xff0c;NIO提供了一种更灵活和高效的 I/O 操作方式&#xff0c;NIO 提供的非阻塞式的 I/O 操作&#xff0c;使得一个单独的线程可以管理多个通道&#xff08;Channel&#xff09;&#xff0c;从而更好地处理并发连接和大量的 I/O 操作。 1. 核心组件 …

高级个人主页

高级个人主页 效果图部分代码领取源码下期更新预报 效果图 部分代码 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1, use…

ESP32重要库示例详解(四):获取NTP时间之time库

在物联网项目中&#xff0c;时间同步和管理是至关重要的功能之一&#xff0c;特别是在需要执行定时任务或记录事件时间戳的场景下。Arduino平台通过其内置的<time.h>库提供了强大的时间处理能力&#xff0c;使得开发者能够方便地与网络时间协议&#xff08;NTP&#xff0…

PDF文件转换为CAD的方法

有时候我们收到一个PDF格式的设计图纸&#xff0c;但还需要进行编辑或修改时&#xff0c;就必须先将PDF文件转换回CAD格式。分享两个将PDF转换回CAD的方法&#xff0c;一个用到在线网站&#xff0c;一个用到PC软件&#xff0c;大家根据情况选择就可以了。 ☞在线CAD网站转换 …

css超出部分省略(单行、多行,多种方法实现)

HTML <p class"text">这是一行测试数据,这是一行测试数据,这是二行测试数据,这是一行测试数据,这是三行测试数据,这是四行测试数据</p>1.单行 .text{width: 200px;border: 1px solid #000000;white-space: nowrap; /* 控制元素不换行 */overflow: hi…

单链表与双链表

实现一个单链表,链表初始为空,支持三种操作: 向链表头插入一个数;删除第 k 个插入的数后面的一个数;在第 𝑘 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。 注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数…

fuel无人机自主探索代码解读1——map_ros.cpp【地图ros接口】

一、概述 map_ros.cpp订阅深度图/雷达点云、世界坐标下传感器pose&#xff0c;每0.05s启动esdf地图更新&#xff0c;每0.05s进行全局地图和局部地图可视化。主要功能为&#xff1a;接受传感器数据、调用sdf_map.cpp文件内部膨胀地图及esdf地图更新接口、地图可视化等。涉及传感…

Python笔记:比较运算符

比较运算符也叫关系运算符。 Python的比较运算符及用法&#xff1a; 比较运算符描述写法等于x y!不等于x ! y>大于x > y<小于x < y>大于等于x > y<小于等于x < y 1、比较运算符会返回布尔类型的结果。&#xff08;True / False&#xff09; num1 …

数电发票、全电发票为什么不是连号的?Node.js发票查验接口集成

全电发票号码为全国统一赋码&#xff0c;采用的是20位发票号码&#xff0c;其实是连续的。只是在实际开票过程中&#xff0c;不止一位纳税人在开&#xff0c;有其他纳税人也在开&#xff0c;所以会出现对某一个纳税人来说号码没有连续的情况。那么&#xff0c;全电发票如何进行…

Django图书馆综合项目-学习(2)

接下来我们来实现一下图书管理系统的一些相关功能 1.在书籍的book_index.html中有一个"查看所有书毂"的超链接按钮&#xff0c;点击进入书籍列表book_list.html页面. 这边我们使用之前创建的命名空间去创建超连接 这里的book 是在根路由创建的namespacelist是在bo…

6. RedHat认证-基于公钥的认证方式

6. RedHat认证-基于公钥的认证方式 主要学习客户端访问服务端的时候&#xff0c;免密登录这一方式 注意: 免密登录只是基于公钥认证的一个附带属性(基于公钥认证的方式更加安全&#xff0c;防止黑客暴力破解) 第一步&#xff1a;将客户端生成的秘钥传送到服务器 在客户端通过…

2024中国(厦门)国际医用消毒及感控设备展览会

2024中国&#xff08;厦门&#xff09;国际医用消毒及感控设备展览会 2024 China (Xiamen) International Medical Disinfection And Infection Control Exhibition 致力于打造医用消毒及感控设备产业采购一站式平台 时 间&#xff1a;2024年11月1-3日 November 1-3, 2024 …

一文扫盲(13):电商管理系统的功能模块和设计要点

电商管理系统是一种用于管理和运营电子商务平台的软件系统。它提供了一系列功能模块&#xff0c;帮助企业进行商品管理、订单管理、会员管理、营销推广、数据分析等工作。本文将从以下四个方面介绍电商管理系统。 一、什么是电商管理系统 电商管理系统是一种集成了各种功能模块…

免费的集成组件有哪些?

集成组件是指将多个软件或系统进行整合&#xff0c;以实现更高效、更可靠的数据处理和管理。在数据管理和分析领域&#xff0c;集成组件是不可或缺的工具之一。 在当今高度信息化的时代&#xff0c;集成组件在各行各业的应用中扮演着举足轻重的角色。集成组件能够将不同来源的…