Qt对象的Qt内存管理

时间:2012-11-23 09:46:34

标签: qt memory-management memory-leaks

我知道有很多关于qt内存管理的问题,但我找不到答案。

因此,对于qt小部件,如果在创建对象时将此传递(父小部件)作为参数传递,则父小部件将获取它的所有权并在父级死亡时将其删除。 将小部件添加到布局并在小部件上设置该布局时,会发生同样的事情。

但是如果我声明一个指向QColor对象的指针会发生什么呢? QColor无法作为其他窗口小部件的子项添加,也无法添加到布局中。当小部件消失或我需要在析构函数中手动删除它时,是否会释放内存?

这里有一个例子......当Widget被销毁时,m_pColor会发生什么?它会被破坏还是会有内存泄漏? 对不起代码中的任何错误,我没有编译它,我只是在这里写的例子。

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class QHBoxLayout;
class QPushButton;
class QColor;

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget( QWidget *parent = NULL );

public:
    QHBoxLayout *m_pLayout;
    QPushButton *m_pButton;
    QColor *m_pColor;
};

#endif // WIDGET_H

#include "widget.h"

#include <QHBoxLayout>
#include <QPushButton>
#include <QColor>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    m_pLayout = new QHBoxLayout;
    m_pButton = new QPushButton( tr( "Button" ) );
    m_pLayout->addWidget( m_pButton );

    m_pColor = new QColor(0, 0, 0, 255);

    setLayout( m_pLayout );
}

2 个答案:

答案 0 :(得分:6)

您建议的内容仅适用于继承QObject的类(即将QObject作为其超类之一)。这些属性不适用于其他类(甚至内置Qt)。由于QColor不是QObject的子类,m_pColor引用的对象在销毁Widget时不会被销毁。你必须手动完成。

答案 1 :(得分:2)

父窗口小部件没有引用来销毁m_pColor。您可以使用Valgrind检查此可执行文件的内存泄漏。