首页 > 系统相关 >Qt内存回收(转载)

Qt内存回收(转载)

时间:2023-03-16 20:00:57浏览次数:59  
标签:Qt parent 对象 QObject 内存 QWidget 转载

在 Qt 中创建对象的时候会提供一个 Parent对象指针(可以查看类的构造函数),下面来解释这个 parent 到底是干什么的。

QObject 是以对象树的形式组织起来的。当你创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。这相当于,在创建 QObject 对象时,可以提供一个其父对象,我们创建的这个 QObject 对象会自动添加到其父对象的 children () 列表。当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!)

QWidget 是能够在屏幕上显示的一切组件的父类。QWidget 继承自 QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该一起被删除。事实就是如此,因为这些都是对话框的子组件。

Qt 引入对象树的概念,在一定程度上解决了内存问题。

  • 当一个 QObject 对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。

  • 任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的 children () 列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有 QObject 会被 delete 两次,这是由析构顺序决定的。

image

综上所述,我们可以得到一个结论: Qt中有内存回收机制, 但是不是所有被new出的对象被自动回收, 满足条件才可以回收 , 如果想要在 Qt 中实现内存的自动回收,需要满足以下两个条件:

  • 创建的对象必须是 QObject 类的子类 (间接子类也可以)
    • QObject 类是没有父类的,Qt 中有很大一部分类都是从这个类派生出去的
      - Qt 中使用频率很高的窗口类和控件都是 QObject 的直接或间接的子类
      - 其他的类可以自己查阅 Qt 帮助文档
  • 创建出的类对象,必须要指定其父对象是谁,一般情况下有两种操作方式:
// 方式1: 通过构造函数
// parent: 当前窗口的父对象, 找构造函数中的 parent 参数即可
QWidget::QWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
QTimer::QTimer(QObject *parent = nullptr);

// 方式2: 通过setParent()方法
// 假设这个控件没有在构造的时候指定符对象, 可以调用QWidget的api指定父窗口对象
void QWidget::setParent(QWidget *parent);
void QObject::setParent(QObject *parent);

作者: 苏丙榅
链接: https://subingwen.cn/qt/qt-primer/#6-内存回收
来源: 爱编程的大丙
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:Qt,parent,对象,QObject,内存,QWidget,转载
From: https://www.cnblogs.com/wozhuyinghao/p/17223940.html

相关文章

  • 【项目实战】基于Pthon+PyQt5的GUI点名程序(附完整源码)
    1、项目说明基于python+PyQt5的GUI点名程序项目实战项目需要安装pycharm社区版或专业版都可,以及项目所需的所有模块项目需要安装pyqt5、pywin32及其他一些模块安装命......
  • Qt中的窗口类
    代码示例#include"mainwindow.h"#include"ui_mainwindow.h"#include"testwidget.h"#include"testdialog.h"MainWindow::MainWindow(QWidget*parent):QMa......
  • Qt5.14封装 QTextEdit可现实行号和列号
    概述开发操作系统:win11Qt版本:5.14封装之初心,用于显示网络和串口收到的源码数据,十六进制显示,每一帧显示一行功能可显示行号和列号可指定列数与行数显示滚动条......
  • Qt项目文件的介绍
    core和gui是需要的模块,一般不用更改,但是如果自己需要用到其他的,则可以自己添加在QT4时,gui和widgets是一体的,但我的版本是5,所以在qt5中,对qt进行了更加细致的分类,把widgets......
  • QtConcurrent 并发 模块使用
    原文链接我的代码example//startathread,executealgorithmQFuture<void>future=QtConcurrent::run(this,&Deployment::useAlgorithm,......
  • C++信号量实现线程间同步,windows使用SetEvent,linux使用sem_t,QT测试
     目录windows使用CreateEvent、SetEvent、ResetEvent、WaitForSingleObjectlinux使用sem_init、sem_wait、sem_trywait、sem_post、sem_destroy windows使用C......
  • QT5笔记: 29. 文本文件读写
    例子:主要讲了QFile、QTextStream进行文本文件读写MainWindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>QT_BEGIN_NAMESPACEnamesp......
  • QT5笔记: 30. 二进制文件读写
    Qt预定义类型文件*.stm标准二进制文件*.dat例子:MainWindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QItemSelectionModel>#include<QMainWin......
  • QT5笔记:27. MDI应用程序设计
    MDI:MultipleDocumentInterface多窗口文档界面例子:MainWindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QMdiSubWindow>......
  • [转载] 新版VSCode中Python设置自动补全函数括号
    前言在网上能找到的关于如何让VSCode中Python自动补全函数括号的方法都是同样的,但基本上都是几年前的方法了,在VSCode更新后引入了Pylance,使得之前的设置项不存在了。在自......