QT 静态单例与对象管理机制导致的指针重复释放问题

这是我在应用中发现的问题,以此记录下。

当我使用Qt创建一个单例dialog时,为了给其设置父对象,我使用了setParent(this)。但由于同时这个单例dialog是个静态对象,使得dialog对象指针被重复释放。

//在waitingdlg.h中
static WaitingDlg &GetInstance(){static WaitingDlg dlg;return dlg;
};//在mainwindow构造函数中(等待1s后执行,是因为需要父对象构造函数执行完后再设置setParent(this))
QTimer::singleShot(1000,this,[=](){WaitingDlg::GetInstance().setParent(this);
});

两次释放的原因分别是:
1、Qt 的父子对象关系管理机制,也称对象树。
在 Qt 中,当我们将一个对象设置为另一个对象的父对象时,就会建立起父子对象关系。父对象负责管理其子对象的内存,当父对象被销毁时,Qt 会自动删除其所有子对象,以确保对象的正确销毁和释放内存。
这种对象管理可以简化内存管理,通过对象树,Qt 可以有效地管理对象的生命周期,并在适当的时候自动释放内存,从而避免内存泄漏和悬空指针问题。
因此当我为dialog设置父对象,程序结束时,Qt会自动释放该内存。
2、静态对象
静态对象在程序结束时会被自动销毁。主要是因为静态对象的生命周期和作用域在编译时就已经确定,所以编译器可以静态地确定它们的生命周期,可以负责管理静态对象的内存,无需程序员手动介入。
因此,如上所述,程序结束时会造成重复释放。

更改

//在waitingdlg.h中
//(这里需要注意的是,m_dlg是静态类型的指针,但是它指向的对象是通过new创建的,是需要程序员手动delete的,所以不会造成对象的重复释放问题)
static WaitingDlg &GetInstance(QWidget *parent = nullptr){if(!m_dlg){m_dlg = new WaitingDlg(parent);}return *m_dlg;};//在类内声明静态成员变量static WaitingDlg *m_dlg;//在类外部进行初始化,通常在.cpp中进行。//(静态指针的初始化不能在类中,是因为静态成员变量属于类的静态空间,而不是属于类的实例)
WaitingDlg* WaitingDlg::m_dlg = nullptr;//在mainwindow中
QTimer::singleShot(1000,this,[=](){WaitingDlg::GetInstance(this);
});

注:

为什么在更改中我没有使用setParent呢,因为我发现还是需要给WaitingDlg的构造函数传parent,才可以使得WaitingDlg是模态窗口
WaitingDlg继承了QDialog,但如果在创建待执行的实例时,并未将parent(每个QWidget都可以有一个parent,数据类型为QWidget*)参数正确传入,那么没有传入parent 或者 parent传入了nullptr都会导致WaitingDlg不是模态窗口。
因此,我需要在调用WaitingDlg的时候,将其父窗口(也就是阻塞的目标窗口)作为参数传入,GetInstance() 就需要接受一个parent参数,使得在调用时传入parent。
这样更改,当我在调用dlg->exec()时,就能正确弹出一个模态窗口了。

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

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

相关文章

linux下脚本监控mysql主从同步异常时发邮件通知

在MySQL中,同步异常监控通常涉及监控复制的状态。可以通过查询SHOW SLAVE STATUS命令来获取复制的状态信息,并对其进行监控。以下是一个简单的SQL脚本,用于监控MySQL复制状态并输出异常信息: 查mysql slave状态 SHOW SLAVE STAT…

==与===的区别

在许多编程语言和脚本语言中,包括 JavaScript 和 PHP 等, 和 是用于比较值的操作符。 “” 是相等运算符,用于比较两个值是否相等。它比较值时会进行类型转换,如果两个值在类型转换后相等,那么它们就被认为是相等的。…

Spark云计算平台Databricks使用,第一个scala程序

1) 创建Spark计算集群 Spark云计算平台Databricks使用,创建workspace和cluster-CSDN博客 2) 创建notebook Workspace -> Users,选择用户,点击Create -> Notebook 选择集群,可以修改notebook名字 修改了notebook名字 选择S…

鸢尾花分类-pytorch实现

前言 本文用pytorch实现了鸢尾花分类,数据不多,只做代码展示用,后续有升级版本。 代码 -*- coding: utf-8 -*- File : main.py Author: Shanmh Time : 2024/05/06 上午9:37 Function:import torch from sklearn import datase…

【Spring】Spring 整合 Junit、MyBatis

一、 Spring 整合 Junit <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache…

Sql Server 2016数据库定时备份

一、 配置备份计划任务 选中“维护计划“--右键--“维护计划向导” 完成

遥控挖掘机之ESP8266调试心得(1)

ESP8266调试心得 1. 前言2.遇到的问题2.1 ESP8266模块建立TCP连接时候报错2.2 指令异常问题 3. 更新ESP8266固件3. ESP8266的部分AT指令3. 连接步骤3.1 模块与电脑连接3.2.1 电脑上的设置3.2.2 ESP8266模块作为客户机&#xff08;TCP Cilent&#xff09;的设置步骤 3.2 模块与模…

从开发角度理解漏洞成因(02)

文章目录 文件上传类需求文件上传漏洞 文件下载类需求文件下载漏洞 扩展 留言板类&#xff08;XSS漏洞&#xff09;需求XSS漏洞 登录类需求cookie伪造漏洞万能密码登录 持续更新中… 文章中代码资源已上传资源&#xff0c;如需要打包好的请点击PHP开发漏洞环境&#xff08;SQL注…

蓝桥杯 算法提高 ADV-1164 和谐宿舍 python AC

贪心&#xff0c;二分 同类型题&#xff1a;蓝桥杯 算法提高 ADV-1175 打包 def judge(x):wood 0max_val 0ans_len 0for i in ll:if i > x:return Falseelif max(max_val, i) * (ans_len 1) < x:max_val max(max_val, i)ans_len 1else:wood 1max_val ians_len …

贝塞尔曲线 java

参考文章&#xff1a; 理解贝塞尔曲线https://blog.csdn.net/weixin_42301220/article/details/125167672 代码实现参考 https://blog.csdn.net/yinhun2012/article/details/118653732 贝塞尔 一二三阶java代码实现,N阶段可以通过降阶递归实现 public class Test extends JPan…

java选择结构语句

文章目录 Java选择结构语句的几种形式1. **if 单选择结构**:2. **if-else 双选择结构**:3. **if-else if 多选择结构**:4. **switch 选择结构**: Java 12及更高版本的Switch Expressions返回值的Switch表达式yield关键字使用Switch作为语句或表达式 Pattern Matching for insta…

Final Draft 12 for Mac:高效专业剧本创作软件

对于剧本创作者来说&#xff0c;一款高效、专业的写作工具是不可或缺的。Final Draft 12 for Mac就是这样一款完美的选择。这款专为Mac用户设计的剧本创作软件&#xff0c;凭借其卓越的性能和丰富的功能&#xff0c;让您的剧本创作更加得心应手。 Final Draft 12支持多种剧本格…

【C++】CentOS环境搭建-编译安装Boost库(附CMAKE编译文件)

【C】环境搭建-编译安装Boost库 Boost库简介Boost库安装通过YUM安装&#xff08;版本较低 V1.53.0&#xff09;通过编译安装&#xff08;官网最新版本1.85.0&#xff09;1.安装相关依赖2.查询官网下载最新安装包并解压3.编译Boost4.安装Boost库到系统路径 Boost库验证 Boost库简…

(22.12.20)matlab2022+yalmip+cplex安装教程,win11 x64

前言 Hi,你好&#xff01;最近刚刚更换新的电脑设备&#xff0c;安装软件时尽量选择最新版本&#xff0c;但也遇到了大大小小的安装问题&#xff0c;这里把踩到的坑一并总结出来&#xff0c;给出一份还算合理的MATLAByalmipCPLEX安装教程&#xff08;win11&#xff09;。 MAT…

从零入门激光SLAM(十三)——LeGo-LOAM源码超详细解析4

大家好呀&#xff0c;我是一个SLAM方向的在读博士&#xff0c;深知SLAM学习过程一路走来的坎坷&#xff0c;也十分感谢各位大佬的优质文章和源码。随着知识的越来越多&#xff0c;越来越细&#xff0c;我准备整理一个自己的激光SLAM学习笔记专栏&#xff0c;从0带大家快速上手激…

OBS插件--视频回放

视频回放 视频回放是一款源插件&#xff0c;它可以将指定源的视频缓存一段时间&#xff08;时间可以设定&#xff09;&#xff0c;将缓存中的视频添加到当前场景中后&#xff0c;可以快速或慢速不限次数的回放。这个功能在类似体育比赛的直播中非常有用&#xff0c;可以捕获指…

【快讯】山东省第四批软件产业高质量发展重点项目开始申报

为加快落实《山东省高端软件“铸魂”工程实施方案&#xff08;2023-2025&#xff09;》&#xff0c;提高软件产业规模能级&#xff0c;提升关键软件技术创新和供给能力&#xff0c;塑强数字经济发展核心竞争力&#xff0c;确定开展第四批软件产业高质量发展重点项目申报工作&am…

CTF-Web Exploitation(持续更新)

CTF-Web Exploitation 1. GET aHEAD Find the flag being held on this server to get ahead of the competition Hints Check out tools like Burpsuite to modify your requests and look at the responses 根据提示使用不同的请求方式得到response可能会得到结果 使用…

如何通过汽车制造供应商协同平台,提高供应链的效率与稳定性?

汽车制造供应商协同是指在汽车制造过程中&#xff0c;整车制造商与其零部件供应商之间建立的一种紧密合作的关系。这种协同关系旨在优化整个供应链的效率&#xff0c;降低成本&#xff0c;提高产品质量&#xff0c;加快创新速度&#xff0c;并最终提升整个汽车产业的竞争力。以…

面试笔记——JVM组成

基本介绍 JVM: Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 使用JVM的好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收机制 JVM的组成及运行流程&#xff1a; 程序计数器 程序计数器&a…