到目前为止,我已经了解到,当父对象被删除时,Qt会释放所有子对象的内存。此外,通常不必关心在堆栈上创建的对象的内存管理(即,不作为指针)。
现在,当我做了非常好的"通讯录"教程时,我在第5部分中发现了这一点:
AddressBook::AddressBook(QWidget *parent) : QWidget(parent)
{
dialog = new FindDialog;
}
完整的来源可用:addressbook.h
addressbook.cpp
finddialog.h
这里,dialog
是AddressBook
的私有成员,并且它是指向FindDialog
的指针。FindDialog
继承了QDialog
,但没有向构造函数传递this
-指针(如上所述)。不存在显式析构函数,不存在delete dialog
调用。。。
此外,不通过this
似乎是故意的:
FindDialog的构造函数被定义为接受父QWidget,即使对话框将作为一个单独的窗口打开。
这不会导致内存泄漏吗?或者是否有其他机制可以静默地删除dialog
并释放其内存?
提前感谢您的帮助!
更新:我在qt-project.org论坛上发布了这个问题,应该很快就会得到解决。
这是没有任何借口的,它最终会遇到比您刚才提到的更多的问题,即:
-
它并不像你说的那样管理。
-
它不使用传统的新Foo()语法。
-
它没有在构造函数的初始值设定项列表中完成。
一旦应用程序退出,操作系统可能会释放它,但无论如何,我总是反对这样的问题,尤其是在示例项目中。在我看来,合适的修复方法是使用堆栈对象而不是堆对象或QPointer
。
请参阅以下帖子以了解后者的详细信息:
如何崩溃(几乎)每个Qt/KDE应用程序以及如何修复
应向上游报告并解决这一问题;抢手货
我刚刚在这里向Gerrit提交了一份关于这件事的变更。