内存pipe理在Qt中?

我对Qt相当陌生,想知道一些基本的内存pipe理和对象的生活。 我什么时候需要删除和/或销毁我的对象? 这是否自动处理?

在下面的例子中,我创build了哪些对象,我需要删除? 当myClass被销毁时,实例variablesmyOtherClass会发生什么? 如果我不删除(或销毁)我的对象,会发生什么? 这会成为记忆问题吗?

MyClass.h

 class MyClass { public: MyClass(); ~MyClass(); MyOtherClass *myOtherClass; }; 

MyClass.cpp

 MyClass::MyClass() { myOtherClass = new MyOtherClass(); MyOtherClass myOtherClass2; QString myString = "Hello"; } 

正如你可以看到这是一个新手很容易的东西,但我在哪里可以轻松地了解这个?

如果你用QObject创build你自己的层次结构,也就是说,你用一个父对象初始化所有新创build的QObject

 QObject* parent = new QObject(); QObject* child = new QObject(parent); 

那么delete parent就足够了,因为parent的析构者会照顾到摧毁child 。 (通过发出信号来做到这一点,所以即使在父母之前手动删除child也是安全的。)

您也可以先删除孩子,顺序无关紧要。 有关订单确实重要的示例,请参阅有关对象树的文档 。

如果你的MyClass不是QObject的子类,你将不得不使用简单的C ++方法。

另外请注意, QObject的父子层次结构通常独立于C ++类层次结构/inheritance树的层次结构。 这意味着, 分配的孩子不需要是其父母的直接子类 。 任何( QObject子类)就足够了。

然而,由于其他原因,施工人员可能会施加一些限制。 比如在QWidget(QWidget* parent=0) ,父级必须是另外一个QWidget ,这是由于例如可见性标志,因为你要做一些基本的布局; 但是对于一般的Qt的层次结构系统,您可以将任何QObject作为父项。

我想扩展Debilski的回答,指出所有权的概念在Qt中非常重要。 当A类获得B类的所有权时,B类被删除,当A类被删除时。 有几种情况下,一个对象成为另一个对象的所有者,而不仅仅是当你创build一个对象并指定它的父对象。

例如:

 QVBoxLayout* layout = new QVBoxLayout; QPushButton someButton = new QPushButton; // No owner specified. layout->addWidget(someButton); // someButton still has no owner. QWidget* widget = new QWidget; widget->setLayout(layout); // someButton is "re-parented". // widget now owns someButton. 

另一个例子:

 QMainWindow* window = new QMainWindow; QWidget* widget = new QWidget; //widget has no owner window->setCentralWidget(widget); //widget is now owned by window. 

因此,经常检查文档,它通常指定一个方法是否会影响对象的所有权。

如Debilski所述,这些规则仅适用于派生自QObject的对象。 如果你的类不是从QObject派生的,你必须自己处理这个破坏。

父(QObject对象或其派生类)有一个指向它的子对象(QObject /它的派生)的指针列表。 父母将销毁其父子节点中的所有对象。 您可以使用QObject的这个属性来使子对象在父对象被删除时自动删除。 关系可以使用下面的代码来build立

 QObject* parent = new QObject(); QObject* child = new QObject(parent); delete parent;//all the child objects will get deleted when parent is deleted, child object which are deleted before the parent object is removed from the parent's child list so those destructor will not get called once again. 

还有其他的方式来pipe理Qt中的内存,使用智能指针。 以下文章介绍了Qt中的各种智能指针。 https://blog.qt.digia.com/blog/2009/08/25/count-with-me-how-many-smart-pointer-classes-does-qt-have/