• 1381阅读
  • 4回复

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

上一主题 下一主题
离线leecok
 

只看楼主 倒序阅读 楼主  发表于: 2018-03-15
       最近在学习QChart的相关示例,对内存的管理机制产生了疑问。
在网上查找了相关Qt内存释放的问题,大致归纳如下:
        只要new出来的对象是QObject,且跟父窗口具有父子关系,当父窗口被销毁的时候,子控件会自动被delete。
  1. Widget::Widget(QWidget *parent)
  2.     : QWidget(parent),
  3. {
  4.     QGridLayout *gridLayout = new QGridLayout( this );
  5.     ...
  6.     m_label = new QLabel( tr("示例表格"), this );
  7.     gridLayout->addWidget(m_label, 0, 0);
  8.     //什么时候可以不用delete对象。
  9.     //Qt具有半自动内存管理机制,
  10.     //必须是QObject或其派生类的对象,并指定了父窗口(父子关系)。
  11.     QChartView *chartView;
  12.     chartView = new QChartView(createLineChart());
  13.     gridLayout->addWidget(chartView, 1, 0);
  14.    chartView = new QChartView(createBarChart(m_valueCount));
  15.    gridLayout->addWidget(chartView, 2, 0);
  16.    setLayout( gridLayout );
  17. }


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

离线stlcours

只看该作者 1楼 发表于: 2018-03-15
chartView-->gridLayout-->Widget,所以也被管起来了
离线leecok

只看该作者 2楼 发表于: 2018-03-16

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

只看该作者 3楼 发表于: 2018-03-16
QGridLayout-->QLayout-->QObject,所以QGridLayout也是QWidget,也得服从父子内存管理,也就是封建主义那一套,父要子亡,子不得不亡。

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

只看该作者 4楼 发表于: 2018-03-17
回 stlcours 的帖子
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.
快速回复
限100 字节
 
上一个 下一个