在 Qt 中使用 'new' 声明变量而不使用 delete

Using 'new' to declare variables without using delete afterward in Qt

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,他们提到:

Only after your program terminates is the operating system able to clean up and “reclaim” all leaked memory.

在我的程序中,有时我确实使用了 delete 当我想完全蒸发某些东西时 table:

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拿着一些 header 文字。

所以...总而言之,这些变量(在应用程序关闭之前一直存在)是否会造成内存泄漏,我必须插入一堆 delete 语句来释放它们,或者OS 最终会处理它吗? (我知道这可能是一个重复的问题,但我在这里得到了很多混合陈述)

P.S: 关于我的机器的一些信息

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

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