gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:36 27 4
gpt4 key购买 nike

到目前为止,我已经了解到,当父对象被删除时,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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com