2012-11-23 31 views
5

qtメモリ管理に関して多くの質問がありますが、私は私の答えを見つけることができませんでした。QtオブジェクトのQtメモリ管理

したがって、qtウィジェットでは、これを(親ウィジェットである)オブジェクト作成時のパラメータとして渡すと、親ウィジェットはその所有権を取得し、親が消滅したときにそれを削除します。 レイアウトにウィジェットを追加し、そのレイアウトをウィジェットに設定すると、同じことが起こります。

しかし、たとえばQColorオブジェクトへのポインタを宣言するとどうなりますか? QColorは別のウィジェットの子として追加することも、レイアウトに追加することもできません。ウィジェットが死んだとき、またはデストラクタで手動で削除する必要があるときにメモリが解放されますか?

ここに例...ウィジェットが破棄されると、m_pColorで何が起こりますか?それは破壊されるか、メモリーリークが起こるでしょうか? コードを間違えて申し訳ありません、私はそれをコンパイルしませんでした、私はちょうど例としてここに書いています。あなたが示唆したこと(すなわち、そのスーパークラスの一つとしてQObjectを持つ)のみQObjectを継承するクラスに対して有効である

#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); 
} 

答えて

6

。これらのプロパティは、他のクラス(組み込みのQt)には適用されません。 QColorのサブクラスはQObjectではないため、m_pColorで参照されるオブジェクトは、Widgetが破棄されても破棄されません。手動で行う必要があります。

2

親ウィジェットがm_pColorを破棄する参照はありません。 Valgrindを使用してこの実行可能ファイルのメモリリークをチェックできます。