qt对象析构顺序记录

news2024/9/20 0:23:56

说明qt对象树 对象析构顺序为:

  1. 本对象的析构函数
  2. 栈成员
  3. 对象树中自己的孩子们
  4. 对象树中自己的孙子们

所以,千万别在孩子对象中(qt对象树特有的这个连带析构关系)去访问父对象的任何栈成员(包括堆成员)的信息了(其实压根父对象自己都别访问了,因为父对象本身就已经先析构了),因为目标内存已经释放了,所以可能导致隐形的崩溃,问题是比较难查的了。

如果非要在子子对象析构函数里访问父对象信息,当父对象仍然存在时是没有问题的(例如Tabwidget包含多个tab页面,手动一个一个先叉掉这些页面,也就是先析构它们,这样就能保证父对象一直存在,即安全的),但是如果是直接叉掉Tabwidget,希望自动析构多个子tab页面,此时就不能在子对象析构函数里访问父对象信息的操作了,如果非要这样干,那就在父对象Tabwidget的析构函数里先一个个子对象的delete吧,这样也是安全了,就是多写几行代码了。

还有个方法也安全:子对象里用发射信号的方式,让父对象执行目标操作,这样为什么安全呢,因为父对象如果已经被析构了,大不了这个槽函数不执行,也不会崩溃的,此外父对象都不存在了,说明是所有对象进行连带析构了,说明软件要关闭了,这个父对象槽函数不执行也无所谓了。

本实验源码:

类A

#ifndef A_H
#define A_H

#include <QObject>


class B;

class A : public QObject
{
    Q_OBJECT
public:
    explicit A(QObject *parent = nullptr);
    ~A();
    
    B* parentB = nullptr;
    
signals:
};

#endif // A_H






#include "a.h"
#include "b.h"

#include <QDebug>



A::A(QObject *parent)
    : QObject{parent}
{
    parentB = (B*)parent;
}

A::~A()
{
    parentB->getA2()->fun("now do getA2()->fun");
    
    qDebug()<<"~A";
}

类A2

#ifndef A2_H
#define A2_H

#include <QObject>

class A2 : public QObject
{
    Q_OBJECT
public:
    explicit A2(QObject *parent = nullptr);
    ~A2();
    
    void fun(QString str);
    
signals:
};

#endif // A2_H






#include "a2.h"

#include <QDebug>

A2::A2(QObject *parent)
    : QObject{parent}
{}

A2::~A2()
{
    qDebug()<<"~A2";
}

void A2::fun(QString str)
{
    qDebug()<<"A2::fun called "<<str;
}

类B

#ifndef B_H
#define B_H

#include <QObject>

#include "a.h"
#include "a2.h"

class B : public QObject
{
    Q_OBJECT
public:
    explicit B(QObject *parent = nullptr);
    ~B();
    
    A2* getA2(){return &a2;}
    

signals:
    
private:
    A2 a2;
    
    A* a = nullptr;
    A* aa = nullptr;
};

#endif // B_H





#include "b.h"

#include <QDebug>

B::B(QObject *parent)
    : QObject{parent}
{
    a = new A(this);
    aa = new A(this);
}

B::~B()
{
    qDebug()<<"~B";
}

类Mainwindow

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include "a.h"


class B;


QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    
private slots:
    void on_pushButton_clicked();
    
private:
    Ui::MainWindow *ui;
    
    B* b;
};
#endif // MAINWINDOW_H










#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "b.h"

#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    b = new B();
}

MainWindow::~MainWindow()
{
    qDebug()<<"~MainWindow";
    
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    qDebug()<<"do delete b";
    delete b;
}


其它可供参考博客:

Qt学习记录(4)——对象树_qt的对象树-CSDN博客

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

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

相关文章

流媒体测试工具 VLC media player

流媒体测试工具 VLC media player 官网下载链接

Vue组件自定义事件、全局事件总线、消息订阅与发布(pubsub)、$nextTick

目录 1. 组件自定义事件2. 全局事件总线(GlobalEventBus)3. 消息订阅与发布(pubsub)4. this.$nextTick 1. 组件自定义事件 一种组件间通信的方式&#xff0c;适用于子组件给父组件传递数据。在父组件中给子组件绑定自定义事件&#xff0c;事件的触发在子组件&#xff0c;事件的…

渗透测试学习资源

burp学院 https://portswigger.net/burp/documentation/desktop/getting-started https://portswigger.net/web-security/ hacker101学院 https://www.hacker101.com/ https://github.com/bugcrowd/bugcrowd_university 如何白嫖自学网络安全技术&#xff0c;最稳最推荐的网…

Python | Leetcode Python题解之第394题字符串解码

题目&#xff1a; 题解&#xff1a; class Solution:def decodeString(self, s: str) -> str:stk []for ss in s:# 不是"]"&#xff0c;照单全收&#xff0c;进栈if ss!"]":stk.append(ss)else:# 遇到"]",把"[]"裹起来的单词取出…

CISAW常见3大认证方向介绍

对于网络安全领域的从业者来说&#xff0c;CISAW这一名称定不会陌生。 事实上&#xff0c;CISAW认证覆盖了三大专业方向&#xff0c;它们分别是安全集成、安全运维以及风险管理。 本文旨在介绍这三个方向的认证要求、目标人群和考试形式。 来找出最适合你的方向吧&#xff01…

重置vCenter Server的root密码

文章目录 重置vCenter Server的root密码一、vCenter Server 6.7之前的版本步骤&#xff1a; 二、vCenter Server 7.0及之后版本步骤&#xff1a; 注意事项 重置vCenter Server的root密码 在虚拟化环境中&#xff0c;VMware vCenter Server扮演着核心管理角色的重任。然而&…

如何在C#应用程序中使用 SQL Server LocalDB 数据库

0. 前言 SQL Server LocalDB 是 Microsoft 提供的一种轻量级 SQL Server 实例&#xff0c;专为开发和测试场景设计。它易于安装和配置&#xff0c;非常适合在本地计算机上进行开发工作。本文将介绍如何在 C# 应用程序中使用 SQL Server LocalDB&#xff0c;包括安装、配置和连接…

基于SpringBoot+Vue技术的宇宙动漫网站

基于SpringBootVue技术的宇宙动漫网站&#xff08;源码L文ppt&#xff09;4-022 系统设计 4.1 总体功能设计 一般个人用户和管理者都需要登录才能进入宇宙动漫网站&#xff0c;使用者登录时会在后台判断使用的权限类型&#xff0c;包括一般使用者和管理者,一般使用者只能…

Spark-ShuffleManager

一、上下文 《Spark-Task启动流程》中我们讲到了ShuffleMapTask中会对这个Stage的结果进行磁盘的写入&#xff0c;并且从SparkEnv中得到了ShuffleManager&#xff0c;且调用了它的getWriter方法并在这个Stage的入口处&#xff08;也就是RDD的迭代器数据源处&#xff09;调用了…

万界星空科技云MES系统:提升生产效率与质量

万界星空科技云MES系统是一款基于云计算技术的智能制造执行系统&#xff0c;它集成了生产计划、生产管理、质量管理、设备管理、仓储管理等多个核心功能模块&#xff0c;旨在为企业提供高效、灵活、安全的生产管理解决方案。以下是对万界星空科技云MES系统功能和应用范围的详细…

地理围栏,打造智能生活新边界

随着智能手机和其他移动设备的普及&#xff0c;用户对基于位置获取个性化服务的需求大幅增加&#xff0c;例如用户进入商圈范围并停留操作一段时间后&#xff0c;智能触发向用户推送该商圈吃、喝、玩、乐的优惠活动消息&#xff1b;又如当用户到达非常驻地的机场时触发围栏&…

2024-MongoDB中国用户大会

周五下午7个小时高铁从深圳赶到上海&#xff0c;周六一天大会&#xff0c;周天飞回深圳。特种兵行动参加“2024-MongoDB中国用户大会”。&#xff0c;缓了两天终于把素材整理出来了。 这也是首次参加MongoDB相关专题会议&#xff0c;MongoDB出现在我接触的大多数项目中&#xf…

什么是法定计量校准?法定计量工作中常会有哪些问题?

什么是法定计量校准&#xff1f; 法制计量校准是以掌握计量和计量的基本内容&#xff0c;依法规划、监督、管理计量为基础&#xff0c;通过政府、企业、个人等多种参与方式和对计量违法行为的监督、处罚。 法制计量校准的目的是为了提高计量工作水平&#xff0c;促进国民经济、…

Type-C接口 未来发展趋势

随着科技的进步&#xff0c;Type-C接口已经逐渐代替了传统的USB接口&#xff0c;Type-C接口的普及将会给我们生活带来很多的便利。 Typez-C接口主要包括正反可插&#xff0c;传输速率高&#xff0c;支持快充协议&#xff0c;安全性高&#xff0c;体积小巧&#xff0c;支持高速…

集团企业主数据管理项目实施步骤及要点

为打破数据孤岛&#xff0c;提升数据治理水平&#xff0c;某省级投资集团率先构建了主数据平台&#xff0c;并成功实现了财务系统、合同系统、人力资源系统及OA门户系统等多系统的无缝对接。通过主数据平台提供的标准化接口&#xff0c;这些关键业务系统能够高效获取所需的主数…

车辆违停智能监测摄像头

车辆违停是城市交通管理中常见的问题&#xff0c;给道路交通秩序和行车安全带来了一定的影响。为了有效监测和处置车辆违停行为&#xff0c;智能监测摄像头被广泛应用于城市道路和停车场等场所。这种摄像头结合了图像识别技术和人工智能算法&#xff0c;能够实时监测并识别违停…

3600关成语填字APP游戏ACCESS\EXCEL数据库

成语类的APP游戏在最近一两年内非常的火爆&#xff0c;其主要原因是几乎所有中国人都能够冲个几十上百关&#xff0c;学习和趣味共享。看图猜成语类的数据之前已经弄到过很多&#xff0c;今天这份成语填字的倒是头一份。 该数据做成的APP效果如下&#xff1a; 数据以\符号分隔…

QGIS编译好后 启动报错qgis.app_app.dll not find lqgis.envfor correct environment paths

报错&#xff1a;qgis.app_app.dll not find lqgis.envfor correct environment paths 一&#xff0c;把 qgis.exe 修改成qgis-bin.exe 二&#xff0c;拷贝osggeo4w下面的qgis-bin.env 文件到当前执行目录

24最新『ComfyUI』入门到入坟全套教程!!看到就是赚到!赶紧收藏!

前言 本文简介 Stable Diffusion WebUI 应该是大多数人第一次接触 SD 绘画的工具&#xff0c;这款工具简单易上手&#xff0c;但操作流程相对固定。如果你想拥有更自由的工作流&#xff0c;可以试试 ComfyUI。而且很多新的模型和功能在刚出现时 ComfyUI 的支持度都比较高&…

IDEA 更新后打开Java项目无法Run

问题 IDEA新建了Java项目&#xff0c;然后更新IDEA之后&#xff0c;没有勾选任何删除配置&#xff0c;但是在新版本打开项目时无法使用Run。 分析 首先这不是Edit Configurations能解决的问题&#xff0c;根因也不是。 打开Project Structure发现除了Name以外的配置都是不可用…