c++ - Qt : AddressBook tutorial 中的内存管理

标签 c++ qt qwidget qtgui qdialog

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

现在,当我做得很好的时候"AddressBook" tutorial ,我在第 5 部分找到了这个:

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

完整的源代码可用: addressbook.h addressbook.cpp finddialog.h

这里,dialogAddressBook 的私有(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/

相关文章:

c++ - 开源 C++ 扫描库

c++ - Setenv:在初始值设定项中将类型表达式列表视为复合表达式

c++ - 示例提供的代码中的 Qt 堆损坏

Qt:在这种情况下应该使用什么布局或布局组合?

c++ - memcpy CString 到 char*

c++ - 就序列点而言,前置增量与后增量

c++ - Qt中如何设置场景在最左边?

c++ - Qt Windows 应用程序打开控制台输出

qt - QLabel 在 QWidget 中不显示

qt - 使用样式表自定义 QDial