qt对象析构顺序记录

说明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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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.xdnf.cn/news/1523460.html

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

相关文章

大模型产品经理学习路线,2024最新,从零基础入门到精通,非常详细收藏我这一篇

随着人工智能技术的发展&#xff0c;尤其是大模型&#xff08;Large Model&#xff09;的兴起&#xff0c;越来越多的企业开始重视这一领域的投入。作为大模型产品经理&#xff0c;你需要具备一系列跨学科的知识和技能&#xff0c;以便有效地推动产品的开发、优化和市场化。以下…

Unity | 内存优化之资源冗余问题

目录 一、资源冗余 1.主动打包和被动打包 2.依赖资源处理 &#xff08;1&#xff09;分别制作AB包&#xff0c;会造成冗余 &#xff08;2&#xff09;资源冗余解决办法&#xff1a; &#xff08;2.1&#xff09;先主动打依赖资源AB包 &#xff08;2.2&#xff09;将两个…

智能分拣投递机器人

产品介绍 自研智能分拣投递机器人&#xff0c;专注于物流行业“NC小件”的分拣与投递&#xff0c;机器人运行稳定、分拣效率高&#xff0c;搭配智能分拣投递系统单台机器人最大作业效率可达400件/H&#xff0c;投递效率相较于传统“小黄人“提升了30%-50%&#xff0c;可替代“…

机器学习之监督学习(一)线性回归、多项式回归、算法优化[巨详细笔记]

机器学习之监督学习&#xff08;一&#xff09;线性回归、多项式回归、算法优化 1.监督学习定义2.监督学习分类2.1回归 regression2.2 分类 classification 3.线性回归 linear regression3.1 单特征线性回归模块一&#xff1a;梯度下降 3.2 多特征线性回归模块二&#xff1a;正…

代码审计总结

代码审计总结 概述 一、代码审计 1.1什么是代码审计&#xff1f; 1.2为什么要执行代码审核&#xff1f; 1.3代码审计的好处 二、代码审计流程 2.1代码检查方法 2.2代码检查项目 2.3编码规范 2.4代码检查规范 2.5缺陷检查表 2.6代码审计复查 2.7代码审计结果总结 三…

Qt25模型-QAbstractTableModel

模型-QAbstractTableModel 知识点modelexmodelex.hmodelex.cpp main.cpp运行图 知识点 //虚函数声明virtual int rowCount(const QModelIndex& parent QModelIndex())const;virtual int columnCount(const QModelIndex& parent QModelIndex())const;QVariant data(cons…

linux之网络子系统-MAC帧、数据报、段 的头部信息

一、MAC帧 格式 MAC帧是属于链路层&#xff0c;网卡发送数据的格式。 MAC帧主要有两种格式&#xff0c;一种是以太网V2标准&#xff0c;一种是IEEE 802.3&#xff0c;常用的是前者。 DMAC&#xff08;Destination MAC&#xff09;是目的MAC地址。DMAC字段长度为6个字节&#…

代码随想录算法训练营_day34

题目信息 62. 不同路径 题目链接: https://leetcode.cn/problems/unique-paths/description/题目描述: 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角…

STM32G474之TIM1更新中断

STM32G474之TIM1能产生如下的中断&#xff1a; 1、捕获比较1个事件&#xff08;Capture compare 1 event&#xff09; 用来获取“捕获输入脉冲的时间”&#xff0c;其次用来输出“比较输出波形”&#xff1b; 2、捕获比较2个事件&#xff08;Capture compare 2 event&#x…

opencv实战项目十九:透射变换倾斜二维码校正

文章目录 前言一、实现方法二、实现代码三&#xff0c;效果 前言 随着科技的飞速发展&#xff0c;二维码作为一种信息载体&#xff0c;已经广泛应用于我们的日常生活中。无论是支付、身份验证还是信息传播&#xff0c;二维码都发挥着不可替代的作用。然而&#xff0c;在实际应…

TeamTalk消息服务器(群组相关)

具体的流程如下介绍&#xff0c;后续需要着重研究数据库相关表的结构设计。 群组信令和协议设计 enum GroupCmdID {CID_GROUP_NORMAL_LIST_REQUEST 1025,CID_GROUP_NORMAL_LIST_RESPONSE 1026,CID_GROUP_INFO_REQUEST 1027,CID_GROUP_INFO_RESPONSE 1028,// ...... 暂时省…

【Python】一文详细向您介绍 bisect_left 函数

【Python】一文详细向您介绍 bisect_left 函数 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#x…

项目管理:项目经理如何才能做好时间管理?

在项目管理中&#xff0c;时间管理是至关重要的环节。作为项目经理&#xff0c;有效的时间管理不仅关乎个人工作效率&#xff0c;更直接影响到项目的整体进度、成本控制和质量保证。 以下是一些建议&#xff0c;帮助项目经理更好地进行时间管理&#xff1a; 一、明确项目目标…

做Ozon的挣钱逻辑,选择高客单高利润的4点原因

以下是选择高客单高利润产品在 Ozon 上销售的四点原因&#xff1a; 一、利润空间更可观 高客单价产品单个利润高&#xff1a;比如销售一件高客单价的高端电子产品&#xff0c;其利润可能是低客单价产品的数倍甚至更多。假设一件低客单价的普通日用品利润为 5 元&#xff0c;而…

2024年9月7日(星期六)骑行滑草场

2024年9月7日 (星期六) 骑行滑草场&#xff0c;早8:30到9:00&#xff0c; 郊野公园西门集合&#xff0c;9:00准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:郊野公园西门集合 &#xff0c;家住东&#xff0c;南&#xff0c;北的骑友在…

护眼灯真的可以保护眼睛吗?曝光劣质护眼台灯常见的三个特征

护眼灯真的可以保护眼睛吗&#xff1f;随着时代的发展&#xff0c;我们注意到越来越多的孩子开始佩戴眼镜。这一趋势引起了许多细心家长的关注&#xff0c;他们认识到这不仅是个别情况&#xff0c;而是现代生活方式和环境对孩子视力健康的挑战。自然而然地&#xff0c;“儿童是…

springboot名著阅读网站

基于 springbootvue实现的名著阅读网站&#xff08;源码L文ppt&#xff09;4-035 4 系统设计 4.1 系统概述 名著阅读网站的设计与开发是指对该系统的各个功能模块进行详细设计&#xff0c;力求每个模块都能够满足用户的要求&#xff0c;系统开发完成后还需对系统进行单元…

C语言 ——— #define 定义宏

目录 何为宏 宏的声明及其使用方式 宏中的括号是否多余 何为宏 #define 机制包括了一个规定&#xff0c;允许把参数替换到文本中&#xff0c;这种实现通常称宏 宏的声明及其使用方式 声明代码演示&#xff1a; #define MAX(x,y) ((x)>(y)?(x):(y)) 使用代码演示&a…

第66期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

xxe漏洞靶场实战通过

1、用nmap扫描C段&#xff0c;找到靶场 2、打开网址&#xff0c;查看robots.txt文件 3、发现有两个目录&#xff0c;分别查看发现一个登录页面 4、使用BP抓包&#xff0c;发现是xml类型 5、尝试查看/etc/passwd 文件&#xff0c;在尝试查看xxe.php文件&#xff0c;发现是编码后…