在 Qt 中使用 'new' 声明变量而不使用 delete
Using 'new' to declare variables without using delete afterward in Qt
从 this post,我可以得出结论,在 Qt 中声明一个新的小部件有两种主要方式(当然可能还有其他方式):
- 未使用
new
关键字:
QLabel lb;
lb.setText("a");
- 使用
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: 关于我的机器的一些信息
- 在 Windows 10、64 位
上运行
- Qt Creator 4.14.2
- Qt 5.15.2 (MSVC
2019,64 位)
所有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
从 this post,我可以得出结论,在 Qt 中声明一个新的小部件有两种主要方式(当然可能还有其他方式):
- 未使用
new
关键字:
QLabel lb;
lb.setText("a");
- 使用
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: 关于我的机器的一些信息
- 在 Windows 10、64 位 上运行
- Qt Creator 4.14.2
- Qt 5.15.2 (MSVC 2019,64 位)
所有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