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

小小菌 2018-03-15 01:59:23
最近在学习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 因为指定了父窗口,所以在父窗口被销毁的时候能被自动释放,而chartView和createLineChart(),createBarChart(m_valueCount)函数中new出来的对象不能被正常释放。不知这样理解对不对。如果是这样,那程序中不是产生了内存泄漏吗?
...全文
1241 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
小小菌 2018-03-17
  • 打赏
  • 举报
回复
已经找到答案。setLayout会把Layout中的控件关联起来。 The QWidget will take ownership of layout.
小小菌 2018-03-16
  • 打赏
  • 举报
回复
引用 2 楼 dext 的回复:
addWidget 会获得所有权。createLineChart() createBarChart(), 没有代码,不知道。
chartView-->gridLayout-->Widget,所以他们被关联起来了?纠结在它们虽然被关联起来了,但并没有被显示释放。 另外在帮助文档中在哪里可以看到Qt内存管理的说明?
dext 2018-03-15
  • 打赏
  • 举报
回复
addWidget 会获得所有权。createLineChart() createBarChart(), 没有代码,不知道。
萧洛 2018-03-15
  • 打赏
  • 举报
回复
自己申请的变量,肯定要自己释放。 QT申请的(比如用qt designer添加的控件),则不用管它。

16,215

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧