5

qtメモリ管理に関して多くの質問があることは知っていますが、私の答えは見つかりませんでした。

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

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

ここに例があります...ウィジェットが破棄されると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 );
}
4

2 に答える 2

6

あなたが提案したことは、継承するクラスQObject(つまりQObject、スーパークラスの1つとして持つ)に対してのみ有効です。これらのプロパティは、他のクラスには適用されません(組み込みの場合でもQt)。QColorのサブクラスではないため、によってQObject参照されるオブジェクトは、m_pColor破棄されても破棄されませんWidget。手動で行う必要があります。

于 2012-11-23T09:51:04.360 に答える
2

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

于 2012-11-23T09:57:41.160 に答える