到目前为止,我已经了解到,当父对象被删除时,Qt 会释放所有子对象的内存。此外,通常不必关心在堆栈上创建的对象(即不是指针)的内存管理。
现在,当我做得很好的时候"AddressBook" tutorial ,我在第 5 部分找到了这个:
AddressBook::AddressBook(QWidget *parent) : QWidget(parent)
{
dialog = new FindDialog;
}
完整的源代码可用:
addressbook.h
addressbook.cpp
finddialog.h
这里,dialog
是AddressBook
的私有(private)成员,它是指向FindDialog
的指针。 FindDialog
继承了 QDialog
,但没有 this
指针传递给构造函数(如上所示)。不存在显式析构函数,不存在删除对话框
-调用...
此外,不传递 this
似乎是故意的:
[The FindDialog's] constructor is defined to accept a parent QWidget, even though the dialog will be opened as a separate window.
这不会导致内存泄漏吗?或者是否有其他一些机制可以静默删除 dialog
并释放其内存?
在此先感谢您的帮助!
更新: 我将此问题发布到 qt-project.org forums它应该很快就会得到修复。
最佳答案
这没有任何借口,它最终会产生比你刚才提出的更多的问题,即:
不是按照你说的管理。
它不使用传统的 new Foo() 语法。
不是在构造函数的初始化列表中完成的。
一旦应用程序退出,操作系统可能会释放它,但无论如何,我总是反对此类问题,尤其是在示例项目中。在我看来,适当的解决方法是使用堆栈对象而不是堆对象或 QPointer
。
如果是后者,请参阅以下帖子以获取详细信息:
How to crash (almost) every Qt/KDE Application and how to fix
这应该在上游报告和修复;好收获!
我刚刚向 Gerrit 提交了关于此 in here 的更改.
关于c++ - Qt : AddressBook tutorial 中的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23195712/