首页| 论坛| 消息

标题:对Qt内存管理机制存在疑问,不知道此时new出来的内存空间是否正常释放
作者:leecok
日期:2018-03-15 14:28
内容:

最近在学习QChart的相关示例,对内存的管理机制产生了疑问。
在网上查找了相关Qt内存释放的问题,大致归纳如下:
只要new出来的对象是QObject,且跟父窗口具有父子关系,当父窗口被销毁的时候,子控件会自动被delete。
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 因为指定了父窗口,所以 ..


#1 [stlcours 03-15 18:32]
chartView-->gridLayout-->Widget,所以也被管起来了
#2 [leecok 03-16 13:17]
chartView-->gridLayout-->Widget,所以他们被关联起来了?纠结在它们虽然被关联起来了,但并没有被显示释放。
另外在帮助文档中在哪里可以看到Qt内存管理的说明?
#3 [stlcours 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
#4 回 stlcours 的帖子 [leecok 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.

回复 发表
主题 版块