找回密码
 立即注册
收起左侧

对Qt内存管理机制存在疑问,不知道此时new出来的内存空间...

3
回复
6973
查看
[复制链接]
累计签到:5 天
连续签到:1 天
来源: 2018-3-15 15:07:13 显示全部楼层 |阅读模式
1Qter豆
        最近在学习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出来的对象不能被正常释放。不知这样理解对不对。如果是这样,那程序中不是产生了内存泄漏吗?

最佳答案

查看完整内容

QObject或其派生类的对象,指定父对象指针后,可以不用显示delete销毁对象,qt自动完成。其余的情况,还是需要自己delete的
回复

使用道具 举报

累计签到:25 天
连续签到:1 天
2018-3-15 15:07:14 显示全部楼层
QObject或其派生类的对象,指定父对象指针后,可以不用显示delete销毁对象,qt自动完成。其余的情况,还是需要自己delete的
回复

使用道具 举报

累计签到:5 天
连续签到:1 天
2018-7-18 09:55:52 显示全部楼层
dearcc 发表于 2018-3-15 15:07
QObject或其派生类的对象,指定父对象指针后,可以不用显示delete销毁对象,qt自动完成。其余的情况,还是 ...

嗯,现在理解了。除了具有父子关系的控件,在窗体中布局管理器里的控件也会被自动释放。

点评

那是因为布局管理器会自动重定义父对象(包括布局管理器里面的部件)为应用布局的那个 QWidget  详情 回复 发表于 2018-7-18 21:51
回复

使用道具 举报

累计签到:120 天
连续签到:1 天
2018-7-18 21:51:18 显示全部楼层
leeCok 发表于 2018-7-18 09:55
嗯,现在理解了。除了具有父子关系的控件,在窗体中布局管理器里的控件也会被自动释放。 ...

那是因为布局管理器会自动重定义父对象(包括布局管理器里面的部件)为应用布局的那个 QWidget
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了