繁体   English   中英

Qt中的内存管理:AddressBook教程

[英]Memory-Management in Qt: AddressBook tutorial

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

现在,当我做了非常好的“AddressBook”教程时 ,我在第5部分中找到了这个:

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

提供完整的源代码: addressbook.h addressbook.cpp finddialog.h

这里, dialogAddressBook的私有成员,它是一个指向FindDialog的指针。 FindDialog继承了QDialog ,但没有this -Pointer传递给构造函数(如上所示)。 没有显式的析构函数,没有delete dialog调用...

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

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

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

在此先感谢您的帮助!

更新:我已将此问题发布到qt-project.org论坛 ,应尽快修复。

这没有任何借口,它最终会有比你刚才提出的问题更多的问题,即:

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

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

  • 它不是在构造函数的初始化列表中完成的。

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

有关后者的详细信息,请参阅以下帖子:

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

这应该在上游报告和修复; 接得好!

我刚刚在这里向Gerrit提交了关于此的更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM