2012-11-23 27 views
5

So che ci sono molte domande sulla gestione della memoria qt ma non sono riuscito a trovare una risposta sul mio.Gestione della memoria Qt per oggetti Qt

Quindi per i widget qt, se si passa questo (che è il widget genitore) come parametro alla creazione dell'oggetto, il widget padre ne assume la proprietà e lo elimina quando il genitore muore. La stessa cosa accade quando si aggiunge un widget a un layout e si imposta tale layout sul widget.

Ma cosa succede se dichiaro un puntatore a un oggetto QColor, ad esempio? QColor non può essere aggiunto come figlio per un altro widget o non può essere aggiunto a un layout. La memoria verrà rilasciata quando il widget muore o devo cancellarlo manualmente nel distruttore?

Ecco un esempio ... cosa succede con m_pColor quando il Widget verrà distrutto? Sarà distrutto o ci sarà una perdita di memoria? Ci scusiamo per eventuali errori nel codice, non l'ho compilato, l'ho appena scritto qui come esempio.

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

risposta

6

Cosa avete suggerito è valido solo per le classi che ereditano QObject (persone che hanno QObject come uno di loro superclasse). Queste proprietà non si applicano ad altre classi (anche built-in Qt). Come QColor non una sottoclasse di QObject, l'oggetto a cui fa riferimento m_pColor non verrà distrutto quando Widget viene distrutto. Dovrai farlo manualmente.

2

Non esiste alcun riferimento per il widget padre per distruggere m_pColor. è possibile utilizzare Valgrind per verificare la perdita di memoria su questo file eseguibile.