Qt:AddressBook教程中的内存管理



到目前为止,我已经了解到,当父对象被删除时,Qt会释放所有子对象的内存。此外,通常不必关心在堆栈上创建的对象的内存管理(即,不作为指针)。

现在,当我做了非常好的"通讯录"教程时,我在第5部分中发现了这一点:

AddressBook::AddressBook(QWidget *parent) : QWidget(parent)
{
    dialog = new FindDialog;
}

完整的来源可用:addressbook.haddressbook.cppfinddialog.h

这里,dialogAddressBook的私有成员,并且它是指向FindDialog的指针。FindDialog继承了QDialog,但没有向构造函数传递this-指针(如上所述)。不存在显式析构函数,不存在delete dialog调用。。。

此外,不通过this似乎是故意的:

FindDialog的构造函数被定义为接受父QWidget,即使对话框将作为一个单独的窗口打开。

这不会导致内存泄漏吗?或者是否有其他机制可以静默地删除dialog并释放其内存?

提前感谢您的帮助!

更新:我在qt-project.org论坛上发布了这个问题,应该很快就会得到解决。

这是没有任何借口的,它最终会遇到比您刚才提到的更多的问题,即:

  • 它并不像你说的那样管理。

  • 它不使用传统的新Foo()语法。

  • 它没有在构造函数的初始值设定项列表中完成。

一旦应用程序退出,操作系统可能会释放它,但无论如何,我总是反对这样的问题,尤其是在示例项目中。在我看来,合适的修复方法是使用堆栈对象而不是堆对象或QPointer

请参阅以下帖子以了解后者的详细信息:

如何崩溃(几乎)每个Qt/KDE应用程序以及如何修复

应向上游报告并解决这一问题;抢手货

我刚刚在这里向Gerrit提交了一份关于这件事的变更。

相关内容

  • 没有找到相关文章

最新更新