在Qt中使用';new';声明变量而不使用Delete [英] Using 'new' to declare variables without using delete afterward in Qt
本文介绍了在Qt中使用';new';声明变量而不使用Delete的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
从this post中,我可以得出结论,在Qt:
中声明新小部件有两种主要方式(当然还有其他方式)- 未使用
new
关键字:
QLabel lb;
lb.setText("a");
- 使用
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中使用';new';声明变量而不使用Delete的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文