在Qt中使用'new'声明变量而不使用Delete [英] Using 'new' to declare variables without using delete afterward in Qt

查看:35
本文介绍了在Qt中使用'new'声明变量而不使用Delete的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

this post中,我可以得出结论,在Qt:

中声明新小部件有两种主要方式(当然还有其他方式)
  1. 未使用new关键字:
QLabel lb;
lb.setText("a");
  1. 使用new关键字:
QLabel *lb = new QLabel;
lb->setText("a");

因此,在我的一些教程中,我看到讲师使用了第二种方法,之后没有使用delete。根据我从很多文章(例如this)上看到的,在使用new时,必须始终在delete之后使用,以避免内存泄漏。

但在阅读其他文章时,例如this article,他们提到:

只有在您的程序终止后,操作系统才能 清理并"回收"所有泄漏的内存。

在我的程序中,有时当我想要完全蒸发桌面上的东西时,我确实使用了delete

QFormLayout *destroyAffineForm = inputFieldAffineBox->findChild<QFormLayout*>("inputFieldFormBoxAffine", Qt::FindChildrenRecursively);
while (destroyAffineForm->count() > 0 && (child = destroyAffineForm->takeAt(0)) != nullptr)
{
    delete child->widget(); // delete the widget
    delete child;   // delete the layout item
}
delete destroyAffineForm;

但通常有很多窗口小部件从程序开始的那一刻起一直保持不变,直到它结束(在结束时我没有调用delete),例如保存一些标题文本的QLabel

所以...总而言之,这些变量(在整个过程中一直存在,直到应用程序关闭)会造成内存泄漏,我必须插入一堆delete语句来释放它们,还是操作系统最终会处理它?(我知道这可能是一个重复的问题,但我在这里得到了很多含混的说法)

附注:有关我的计算机的一些信息

  • 在64位Windows 10上运行
  • Qt Creator 4.14.2
  • Qt 5.15.2(MSVC 2019,64位)

推荐答案

所有QObject将自动删除自己的子对象。(请参阅文档here。)QWidget是QObject。因此,只要建立了父/子关系,就不需要手动删除对象。为此,只需将指向父对象的指针传递给构造函数:

QLabel *label1 = new QLabel;   // <<- NEED TO DELETE
QLabel *label2 = new QLabel(some_parent_obj);   // Will be deleted when some_parent_obj is deleted

这篇关于在Qt中使用&#39;new&#39;声明变量而不使用Delete的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆