查看完整版本: [-- 对Qt内存管理机制存在疑问,不知道此时new出来的内存空间是否正常释放 --]

QTCN开发网 -> Qt基础编程 -> 对Qt内存管理机制存在疑问,不知道此时new出来的内存空间是否正常释放 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

leecok 2018-03-15 14:28

对Qt内存管理机制存在疑问,不知道此时new出来的内存空间是否正常释放

       最近在学习QChart的相关示例,对内存的管理机制产生了疑问。
在网上查找了相关Qt内存释放的问题,大致归纳如下:
        只要new出来的对象是QObject,且跟父窗口具有父子关系,当父窗口被销毁的时候,子控件会自动被delete。
  1. Widget::Widget(QWidget *parent)
        : QWidget(parent),
    {
        QGridLayout *gridLayout = new QGridLayout( this );
        ...
        m_label = new QLabel( tr("示例表格"), this );

        gridLayout->addWidget(m_label, 0, 0);

        //什么时候可以不用delete对象。
        //Qt具有半自动内存管理机制,
        //必须是QObject或其派生类的对象,并指定了父窗口(父子关系)。
        QChartView *chartView;

        chartView = new QChartView(createLineChart());
        gridLayout->addWidget(chartView, 1, 0);

       chartView = new QChartView(createBarChart(m_valueCount));
       gridLayout->addWidget(chartView, 2, 0);

       setLayout( gridLayout );
    }


代码片段如上,QChartView的显示方式是按照Qt中的示例代码来写的。
是否代码中的m_labe,gridLayout 因为指定了父窗口,所以在父窗口被销毁的时候能被自动释放,而chartView和createLineChart(),createBarChart(m_valueCount)函数中new出来的对象不能被正常释放。不知这样理解对不对。如果是这样,那程序中不是产生了内存泄漏吗?


stlcours 2018-03-15 18:32
chartView-->gridLayout-->Widget,所以也被管起来了

leecok 2018-03-16 13:17

chartView-->gridLayout-->Widget,所以他们被关联起来了?纠结在它们虽然被关联起来了,但并没有被显示释放。
另外在帮助文档中在哪里可以看到Qt内存管理的说明?

stlcours 2018-03-16 17:35
QGridLayout-->QLayout-->QObject,所以QGridLayout也是QWidget,也得服从父子内存管理,也就是封建主义那一套,父要子亡,子不得不亡。

然后就是setLayout
The QWidget will take ownership of layout. 取得所有权
http://doc.qt.io/qt-5/qwidget.html#setLayout

leecok 2018-03-17 08:23
stlcours:QGridLayout-->QLayout-->QObject,所以QGridLayout也是QWidget,也得服从父子内存管理,也就是封建主义那一套,父要子亡,子不得不亡。
然后就是setLayout:
The QWidget will take ownership of layout. 取得所有权
http://doc.qt.io/qt-5/qwidget.html#setLayout
..... .. (2018-03-16 17:35) 

十分感谢!!
文档中的最后一句居然被自己漏掉了。The QWidget will take ownership of layout.


查看完整版本: [-- 对Qt内存管理机制存在疑问,不知道此时new出来的内存空间是否正常释放 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled