c++ - Qt中的内存管理?

标签 c++ qt memory object

我对 Qt 还很陌生,想了解一些关于内存管理和对象生命周期的基本知识。我什么时候需要删除和/或销毁我的对象?这些都是自动处理的吗?

在下面的示例中,我需要删除我创建的哪些对象?当 myClass 被销毁时,实例变量 myOtherClass 会发生什么?如果我根本不删除(或销毁)我的对象会发生什么?这会是内存的问题吗?

MyClass.h

class MyClass
{

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

MyClass.cpp

MyClass::MyClass() {
    myOtherClass = new MyOtherClass();

    MyOtherClass myOtherClass2;

    QString myString = "Hello";
}

如您所见,这是非常适合新手的东西,但我在哪里可以轻松了解这一点?

最佳答案

如果您使用 QObjects 构建自己的层次结构,也就是说,您使用父级初始化所有新创建的 QObjects,

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

那么delete parent就足够了,因为parent的析构函数会负责销毁child。 (它通过发出信号来做到这一点,因此即使您在父级之前手动删除 child 也是安全的。)

您也可以先删除 child ,顺序无关紧要。例如,这里的顺序 确实 很重要 the documentation about object trees .

如果您的 MyClass 不是 QObject 的子级,则必须使用普通的 C++ 处理方式。

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

但是,由于其他原因,构造函数可能会施加一些限制;例如在 QWidget(QWidget* parent=0) 中,父级必须是另一个 QWidget,例如可见性标志,因为您会以这种方式进行一些基本布局;但是对于 Qt 的层次系统,一般来说,您可以将任何 QObject 作为父级。

关于c++ - Qt中的内存管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2491707/

相关文章:

c++ - 是否可以像这样重载 operator<< ?

html - 调整 QT 的 QTextEdit 大小以匹配文本宽度

c++ - 将 c++ QAbstractSeries 添加到 QML 图 TableView

python - 这个for循环中是什么占用了内存?

unix - unix 机器上的缓存内存不断增长

assembly - Xtensa指令: L32R - which addres is loaded?

c++ - How to get around GCC ‘*((void*)& b +4)’ may be used uninitialized in this function warning while using boost::optional

c++ - 在哪里放置编译时常量数组?

c++ - 写入 Directshow 源过滤器

python - 检测关键序列