【问题标题】:Qt Memory Management for Qt objectsQt 对象的 Qt 内存管理
【发布时间】:2012-11-23 09:46:33
【问题描述】:

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

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

但是如果我声明一个指向 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 );
}

【问题讨论】:

    标签: qt memory-management memory-leaks


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-30
        • 2011-01-30
        • 1970-01-01
        • 2012-02-27
        • 2019-09-27
        • 1970-01-01
        • 2014-06-02
        • 2014-06-05
        相关资源
        最近更新 更多