Qt 的内存管理机制

这篇具有很好参考价值的文章主要介绍了Qt 的内存管理机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Qt 的内存管理机制

Qt 的对象树

利用代码查看自动释放


Qt 的内存管理机制

Qt 的对象树

Qt 中所有的控件都是被一颗多叉树管理起来的,这样就是为了方便释放资源的时候方便释放,而我们在编写代码的时候,创建对应的控件,然后将对应的控件添加到 Qt 的对象树中,此时这个对象的释放问题也就不需要我们操心.

假设现在有一个 QWidget,然后这个 Widget 种还有一些其他的控件,里面有一个 QLabe、QPushButton、QListWidget,然后 QListWidget 中还有三个 Item 那么这个对象树是什么样子的呢?

Qt 的内存管理机制,开发语言,qt

此时我们看到的可能就是这样,那么此时的对象树是什么样子的呢?我们可以简单的画一下。

Qt 的内存管理机制,开发语言,qt

此时这就是 Qt 中对象树的样子。而我们释放这些控件的时候,当然也是希望一起释放的比较好,那么如果当一个控件提前就释放了呢?如果提前就释放了,那么当在界面上显示的时候,是没有该控件的,因为已经释放了当然也就是显示不出来的。

利用代码查看自动释放

既然我们知道了,当我们将一个控件加入到对象树的时候,这个对象就会合适的时候自动释放,那么首先什么是合适的时候呢?其实就是当我们关闭界面的时候,因为关闭界面了,说明我们已经不需要这个界面里面的控件显示了,所以我们理所当然的是可以将该控件释放掉的。

那么下面我们就写一个代码,我们自己写一个类,这个类继承自 QLabel,当然继承其他的可以挂到对象树上的类也是可以的,因为 QLabel 可以显示出来,所以我们创建一个类继承自 QLabel,然后我们重写这个类的析构函数,我们在这个类的析构函数里面添加一个打印语句,这样我们就可以在释放的时候看到是否释放了。

在看这个代码之前,我们在学习一下 Qt 中新建其他文件的方法,我们目前想要新建的是一个 C++ 文件,所以我们点击左上角的文件,然后点击新建文件。

Qt 的内存管理机制,开发语言,qt

然后我们选择 C++ ,然后在选择 C++ class,然后点击 choss ,后面就会弹出一个对话框。

Qt 的内存管理机制,开发语言,qt

等弹出这个对话框后,我们写想要的类名,以及想要继承类的名字,因为我们想要继承 QLabel,所以这里就选择 QLabel,然后点击next即可。

Qt 的内存管理机制,开发语言,qt

创建好后,这个就是我们创建类的头文件,不过这里选择继承的类并不会帮我们添加对应的头文件,所以我们需要自己添加基类的头文件。

创建好后,那么就可以了吗?其实并不行,我们前面说了,想要将一个对象挂到对象树上,那么这个就需要将这个对象的构造函数传入一个想要挂的对象的指针,而我们这个继承自 QLabel,所以我们就需要一个 QWidget 类型的指针,用来接收它的父节点的指针,然后用这个参数给MyLabel的基类来进行初始化。

#include "mylabel.h"
​
MyLabel::MyLabel(QWidget *parent)
    :QLabel(parent)
{
    
}

那么下一步就是我们需要重写它的析构函数了,然后我们在它的析构函数里面添加一行打印语句,我们就可以看到析构的过程了。

MyLabel::~MyLabel()
{
    qDebug() << "MyLabel 被析构";
}

在下一步,就是我们需要在 Widget 的构造函数中创建该对象,然后我们查看它的释放过程。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
​
    MyLabel* mylabel = new MyLabel(this);
    mylabel->setText("Hello World");
}

下面我们就点击运行,当我们没有关闭界面的时候,mylabel 并不会析构,而是当我们点击关闭按钮后,mylabel 就析构了。文章来源地址https://www.toymoban.com/news/detail-854419.html

到了这里,关于Qt 的内存管理机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT上位机开发(会员管理软件)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         前面我们学习了ini文件的解析办法,通过QSettings类就可以很轻松地访问ini文件里面的数据。除了ini文件之外,另外一种经常出现的文件格式其实是json格式。一般来说,如果读写的数据

    2024年02月03日
    浏览(38)
  • C++ Qt开发:QProcess进程管理模块

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用 QProcess 组件实现针对进程的控制管理等。 当你在使用Qt进行跨平台应

    2024年03月22日
    浏览(34)
  • 【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 战斗背景:做了个串口接收界面,用来接收传输过来的信号。但是光用数字显示太单调,需要用图线显示出来。 战略目标:干掉它。 战术路线:Qt 绘图可以使用 Qt Charts,先了解

    2024年02月11日
    浏览(52)
  • THRUST:一个开源的、面向异构系统的并行编程语言:编程模型主要包括:数据并行性、任务并行性、内存管理、内存访问控制、原子操作、同步机制、错误处理机制、混合编程模型、运行时系统等

    作者:禅与计算机程序设计艺术 https://github.com/NVIDIA/thrust 2021年8月,当代科技巨头Facebook宣布其开发了名为THRUST的高性能计算语言,可用于在设备、集群和云环境中进行并行计算。它具有“易于学习”、“简单易用”等特征,正在逐步取代C++、CUDA、OpenCL等传统编程模型,成为

    2024年02月07日
    浏览(50)
  • 【VisualStudio】使用 C++ 语言开发 Qt 环境配置教程

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 先上一张效果图,具体步骤主要分为以下三步。 这一步不再赘述,注意一定要安装 C++ 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 这一步也不再赘述,网上搜索教

    2024年02月10日
    浏览(77)
  • 【VisualStudio】基于 Visual Studio 使用 C++ 语言开发 Qt 环境配置教程

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 先上一张效果图,具体步骤主要分为以下三步。 这一步不再赘述,注意一定要安装 C++ 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 这一步也不再赘述,网上搜索教

    2024年02月15日
    浏览(70)
  • 【Visual Studio】使用 C++ 语言,配合 Qt,开发了一个串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 我要使用的功能比较简单,主要包含扫描串口、打开串口、发送数据、接收数据、暂停按钮、停止按钮,因此接下里将围绕这几个功能依次更新。 我的工程项目名字叫 “GUI”。

    2024年02月11日
    浏览(71)
  • 【Visual Studio】报错 C2653,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 这个 Bug 是我做这个工程时遇到的:【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面。 使用 C++ 语言,配合 Qt 开发串口通信界面,在添加 Widget 做

    2024年02月11日
    浏览(55)
  • QT笔记——QT类反射机制简单学习

    学习 QT的 类反射机制 使用Qt 反射机制的条件 1.需要继承自QObject 类 或者 它的 派生类 ,并需要在类中加入Q_OBJECT 宏 2.注册成员函数:若希望普通成员函数能够被反射,需要在函数声明之前加入Q_INVOKABLE 宏。 3.注册成员变量:若希望成员变量能被反射,需要使用Q_PROPERTY 宏。

    2024年02月09日
    浏览(122)
  • Go语言开发者的Apache Arrow使用指南:内存管理

    如果你看了上一篇《Go语言开发者的Apache Arrow使用指南:数据类型》 [1] 中的诸多Go操作arrow的代码示例,你很可能会被代码中大量使用的Retain和Release方法搞晕。不光大家有这样的感觉,我也有同样的feeling:**Go是GC语言 [2] ,为什么还要借助另外一套Retain和Release来进行内存管理

    2024年02月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包