前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >看Qt源码理解半自动内存管理

看Qt源码理解半自动内存管理

作者头像
Qt君
发布2020-05-25 15:49:52
1.2K0
发布2020-05-25 15:49:52
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

❝继承于QObject并设置setParent即可获得半自动内存管理的能力。 ❞

0x01 半自动内存管理小例子

代码语言:javascript
复制
QWidget     *widget = new QWidget;
QPushButton *button = new QPushButton(w);

delete widget;
widget = NULL;

  由于button对象的父对象是widget,则删除widget后会同时删除button的内存,并不再需要手动删除button对象的内存。   析构顺序:先析构QPushButton再析构QWidget。

0x02 简单原理

  当继承于QObject的对象使用了setParent接口或构造时传入父类对象则会将当前指针加入到指针列表中,而父对象析构前,将会按加入顺序递归析构其子对象。

0x03 源码体现

(1) 继承关系源码体现

  • QObject构造函数(省略无关细节):
代码语言:javascript
复制
QObject::QObject(QObject *parent)
    : d_ptr(new QObjectPrivate)
{
    ...
    setParent(parent); /* 设置父对象 */
    ...
}
  • setParent成员函数:
代码语言:javascript
复制
void QObject::setParent(QObject *parent)
{
    Q_D(QObject);
    Q_ASSERT(!d->isWidget);
    d->setParent_helper(parent);
}
  • 我们继续跳转到setParent_helper实现(省略无关细节),我们可以看到它会将q指针存入到父类的children列表容器中。
代码语言:javascript
复制
#define Q_Q(Class) Class * const q = q_func()
void QObjectPrivate::setParent_helper(QObject *o)
{
    ...
    parent = o;
    parent->d_func()->children.append(q); /* 这里的q是QObjectData里面的q_ptr指针 */
    ...
}

(2) 父对象析构后析构子对象源码体现

  • 我们可以看到QObject析构函数内部实现,如果有子对象存在则删除所有子对象。
代码语言:javascript
复制
QObject::~QObject()
{
    ...
    if (!d->children.isEmpty())
        d->deleteChildren();
    ...
  • 我们继续看deleteChildren实现,可以看到它遍历父对象下的所有子对象进行逐一删除操作。
代码语言:javascript
复制
void QObjectPrivate::deleteChildren()
{
    ...
    for (int i = 0; i < children.count(); ++i) {
        currentChildBeingDeleted = children.at(i);
        children[i] = 0;
        delete currentChildBeingDeleted;
    }
    children.clear();
    ...
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 半自动内存管理小例子
  • 0x02 简单原理
  • 0x03 源码体现
    • (1) 继承关系源码体现
      • (2) 父对象析构后析构子对象源码体现
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档