Come pulire un QList complesso?
Domanda
Io sto usando un QList piuttosto complesso in una derivazione di QAbstractTableModel per memorizzare i dati:
class MyTableModel : public QAbstractTableModel {
Q_OBJECT
QList<QHash<int, QHash<int, QVariant> *> *> m_data;
/*...*/
};
MyTableModel::~TMusicTableModel() {
/* Should I deallocate QList items? */
}
MyTableModel::setData(int row, int col, int type, QVariant value) {
/* inserting a new data field */
QHash<int, QHash<int, QVariant> *> *row_hash = new QHash<int, QHash<int, QVariant> *>();
QHash<int, QVariant> *role_hash = new QHash<int, QVariant>();
type_hash->insert(type, value);
row_hash->insert(col, type_hash);
m_data.insert(row, row_hash);
return true;
}
Mi chiedo se il QList e QHashes si prendono cura della deallaction o se devo farlo. La documentazione non è molto informativo in questo caso.
Soluzione
Perché si sta creando le voci secondarie con "nuovo", si ha a rilasciare da soli. Vedere la funzione qDeleteAll di un modo rapido di farlo.
C'è un motivo per cui si sta utilizzando nuovi per creare questi hashs? (Il codice è ovviamente solo un frammento, in modo che i puntatori possono essere utilizzati e passati in giro altrove.) In generale, è molto più semplice per loro di costruire solo sullo stack in modo che la distruzione avviene automaticamente.
Altri suggerimenti
Come qualsiasi altra classe contenitore praticamente in qualsiasi libreria C ++, distruggendo si attiva anche il distruttore degli elementi in esso. questo è vero per un semplice MyClass array[3]
, per STL vector<MyClass>
e per QList<MyClass>
di QT pure.
Per assicurarsi che tutto è distrutto il necessario per fare in modo che MyClass ha un distruttore che rilascia effettivamente tutte le risorse. Avere un QList di puntatori non seguire questa regola, perché i puntatori non hanno distruttori. invece si consiglia di utilizzare shared_ptr di spinta o lascia la tua puntatore involucro intelligente.