我对 Qt 还很陌生,想了解一些关于内存管理和对象生命周期的基本知识。我什么时候需要删除和/或销毁我的对象?这些都是自动处理的吗?
在下面的示例中,我需要删除我创建的哪些对象?当 myClass
被销毁时,实例变量 myOtherClass
会发生什么?如果我根本不删除(或销毁)我的对象会发生什么?这会是内存的问题吗?
MyClass.h
class MyClass
{
public:
MyClass();
~MyClass();
MyOtherClass *myOtherClass;
};
MyClass.cpp
MyClass::MyClass() {
myOtherClass = new MyOtherClass();
MyOtherClass myOtherClass2;
QString myString = "Hello";
}
如您所见,这是非常适合新手的东西,但我在哪里可以轻松了解这一点?
最佳答案
如果您使用 QObject
s 构建自己的层次结构,也就是说,您使用父级初始化所有新创建的 QObject
s,
QObject* parent = new QObject();
QObject* child = new QObject(parent);
那么delete
parent
就足够了,因为parent
的析构函数会负责销毁child
。 (它通过发出信号来做到这一点,因此即使您在父级之前手动删除 child
也是安全的。)
您也可以先删除 child ,顺序无关紧要。例如,这里的顺序 确实 很重要 the documentation about object trees .
如果您的 MyClass
不是 QObject
的子级,则必须使用普通的 C++ 处理方式。
另外,请注意 QObject
s 的父子层次结构通常独立于 C++ 类层次结构/继承树的层次结构。这意味着,分配的子类不需要是其父类的直接子类。 QObject
的任何(子类)都足够了。
但是,由于其他原因,构造函数可能会施加一些限制;例如在 QWidget(QWidget* parent=0)
中,父级必须是另一个 QWidget
,例如可见性标志,因为您会以这种方式进行一些基本布局;但是对于 Qt 的层次系统,一般来说,您可以将任何 QObject
作为父级。
关于c++ - Qt中的内存管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2491707/